From 1906cf93f86d8d66f45f90380a8d3da25c087ee5 Mon Sep 17 00:00:00 2001 From: "Yann E. MORIN\"" Date: Sat, 24 Feb 2007 11:00:05 +0000 Subject: Add the full crosstool-NG sources to the new repository of its own. You might just say: 'Yeah! crosstool-NG's got its own repo!". Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup. That means I'm putting backups in place in the afternoon. That also means we've lost history... :-( diff --git a/.cdtproject b/.cdtproject new file mode 100644 index 0000000..6940585 --- /dev/null +++ b/.cdtproject @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +make + +all +true +true + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..521ece3 --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + crosstool-ng + + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/org.eclipse.cdt.make.core.makeBuilder.launch + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/org.eclipse.cdt.make.core.ScannerConfigBuilder.launch + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.make.core.makeNature + org.eclipse.cdt.make.core.ScannerConfigNature + + diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..d9cabed --- /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 0000000..8c36fbe --- /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 0000000..b571936 --- /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 0000000..d24842f --- /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 0000000..bab7828 --- /dev/null +++ b/Makefile @@ -0,0 +1,46 @@ +# Makefile for crosstool-NG. +# Copyright 2006 Yann E. MORIN + +# 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 0000000..2d1f154 --- /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 0000000..e91b64e --- /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 0000000..18eb559 --- /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 0000000..f922219 --- /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 0000000..e69de29 diff --git a/config/cc_gcc.in b/config/cc_gcc.in new file mode 100644 index 0000000..3e64b7f --- /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 0000000..e69de29 diff --git a/config/config.in b/config/config.in new file mode 100644 index 0000000..76bc8ca --- /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 0000000..e61b132 --- /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 0000000..414ab26 --- /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 0000000..1edac59 --- /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 0000000..aa07cad --- /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 0000000..f18bed5 --- /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 0000000..f89957b --- /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 0000000..820df6e --- /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 0000000..ba6a1be --- /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 0000000..867e0a0 --- /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 0000000..f693912 --- /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 "" + +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 0000000..42a7a3a --- /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 0000000..8027180 --- /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 +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 / +__________/ + + diff --git a/kconfig/Makefile b/kconfig/Makefile new file mode 100644 index 0000000..7463548 --- /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=" + +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 0000000..1b5b5d5 --- /dev/null +++ b/kconfig/conf.c @@ -0,0 +1,623 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include +#include + +#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 0000000..8d79f44 --- /dev/null +++ b/kconfig/confdata.c @@ -0,0 +1,800 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 0000000..6f98dbf --- /dev/null +++ b/kconfig/expr.c @@ -0,0 +1,1100 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include + +#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, ""); + 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, "", 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 0000000..6084525 --- /dev/null +++ b/kconfig/expr.h @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef EXPR_H +#define EXPR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifndef __cplusplus +#include +#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 0000000..800f8c7 --- /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 +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . 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 +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 + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include + +#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 +#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 : ""; +} + diff --git a/kconfig/lkc.h b/kconfig/lkc.h new file mode 100644 index 0000000..cf32679 --- /dev/null +++ b/kconfig/lkc.h @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2002 Roman Zippel + * 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 +#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 0000000..a263746 --- /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 0000000..a8999d8 --- /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 0000000..120d624 --- /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=""' + elif [ -f /usr/include/ncurses/curses.h ]; then + echo '-I/usr/include/ncurses -DCURSES_LOC=""' + elif [ -f /usr/include/ncurses.h ]; then + echo '-DCURSES_LOC=""' + else + echo '-DCURSES_LOC=""' + 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 0000000..cf69708 --- /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 0000000..fd695e1 --- /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 +#include +#include +#include +#include +#include +#include + +#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 0000000..05e7206 --- /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 0000000..0d83159 --- /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 0000000..fabfc1a --- /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 0000000..ebc781b --- /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 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 0000000..ee0a04e --- /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 0000000..8f268be --- /dev/null +++ b/kconfig/mconf.c @@ -0,0 +1,919 @@ +/* + * Copyright (C) 2002 Roman Zippel + * 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 + * + * i18n, 2005, Arnaldo Carvalho de Melo + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 [*], 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 to build it in, to make it a module or\n" +" to removed it. You may also press the 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 .\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 and keys to scroll\n" +" unseen options into view.\n" +"\n" +"o To exit a menu use the cursor keys to highlight the button\n" +" and press .\n" +"\n" +" Shortcut: Press or or if there is no hotkey\n" +" using those letters. You may press a single , but\n" +" there is a delayed response which you may find annoying.\n" +"\n" +" Also, the and cursor keys will cycle between and\n" +" \n" +"\n" +"\n" +"Data Entry\n" +"-----------\n" +"o Enter the requested information and press \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 or cursor keys to highlight the help option\n" +" and press . You can try 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 and for those\n" +" who are familiar with less and lynx.\n" +"\n" +"o Press , , or 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" +" 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= 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. " + " selects submenus --->. " + "Highlighted letters are hotkeys. " + "Pressing includes, excludes, modularizes features. " + "Press to exit, for Help, for Search. " + "Legend: [*] built-in [ ] excluded 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 . " + "Press for additional information about this option."), +inputbox_instructions_int[] = N_( + "Please enter a decimal value. " + "Fractions will not be accepted. " + "Use the key to move from the input field to the buttons below it."), +inputbox_instructions_hex[] = N_( + "Please enter a hexadecimal value. " + "Use the key to move from the input field to the buttons below it."), +inputbox_instructions_string[] = N_( + "Please enter a string value. " + "Use the 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 ( [=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 : "", + 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" + " 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 0000000..c86c27f --- /dev/null +++ b/kconfig/menu.c @@ -0,0 +1,419 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include + +#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 : "", + 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 0000000..34f42fb --- /dev/null +++ b/kconfig/symbol.c @@ -0,0 +1,882 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include + +#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 0000000..e3f28b9 --- /dev/null +++ b/kconfig/util.c @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2002-2005 Roman Zippel + * Copyright (C) 2002-2005 Sam Ravnborg + * + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#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 0000000..47c8b5b --- /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 ." +#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 0000000..34ccabd --- /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 + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include + +#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 /* 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 /* 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 /* 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 /* 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 ""; +} + +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 0000000..6f1fae7 --- /dev/null +++ b/licenses/by-sa/deed.en @@ -0,0 +1,306 @@ + +Creative Commons Deed + + + + + + + + + + + +

Creative Commons

+ + + +
+This page is available in the following languages: +
+ + + +българÑки + + + + +Català + + + + +Dansk + + + + +Deutsch + + + + +English + + + + +English (CA) + + + + +English (GB) + + + + +Castellano + + + + +Castellano (AR) + + + + +Español (CL) + + + + +Castellano (MX) + + + + +Euskara + + + + +Suomeksi + + + + +français + + + + +français (CA) + + + + +Galego + + + + +עברית + + + + +hrvatski + + + + +Magyar + + + + +Italiano + + + + +日本語 + + + + +한국어 + + + + +Melayu + + + + +Nederlands + + + + +polski + + + + +Português + + + + +Português (PT) + + + + +svenska + + + + +slovenski jezik + + + + +简体中文 + + + + +è¯èªž (å°ç£) + + +
+ + + + +
+ +
+ + Creative Commons Deed + +

Attribution-ShareAlike 2.5

+ + + +
+ + + +

You are free:

+ +
    + +
  • to copy, distribute, display, and perform the work
  • + +
  • to make derivative works
  • + +
  • to make commercial use of the work
  • + +
+ + + +

Under the following conditions:

+ +
+ + + + + + + + + + + + +
+ by + +
Attribution. + You must attribute the work in the manner specified by the author or licensor.
+
+ sa + +
Share Alike. +If you alter, transform, or build upon this work, you may distribute +the resulting work only under a license identical to this one.
+
+ + + +
    + +
  • For any reuse or distribution, you must make clear to others the license terms of this work.
  • + +
  • Any of these conditions can be waived if you get permission from the copyright holder.
  • + +
+ + + +

Your fair use and other rights are in no way affected by the above.

+ + + + + +

+ + + This is a human-readable summary of the Legal Code (the full license). + +

+ + + + + + + +

 

+ +
+ +
+ +
+ +

+ +Learn how to distribute your work using this license + +

+ + + + + \ 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 0000000..ef811af 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 0000000..2160a80 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 0000000..7c50dbc --- /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 0000000..6024290 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 0000000..31dfb98 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 0000000..6cf807e --- /dev/null +++ b/licenses/by-sa/legalcode @@ -0,0 +1,378 @@ + +Creative Commons Legal Code + + + + + + +

Creative Commons

+ + + +
+
Creative Commons Legal Code
+ + +

Attribution-ShareAlike 2.5

+ + +
+ + +
+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.
+ + + + +

License

+ +

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.

+ +

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.

+ + +

1. Definitions

+ +
    +
  1. +"Collective Work" 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. +
  2. + +
  3. +"Derivative Work" 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. +
  4. + +
  5. +"Licensor" means the individual or entity that offers the Work under the terms of this License. +
  6. + +
  7. +"Original Author" means the individual or entity who created the Work. +
  8. + +
  9. +"Work" means the copyrightable work of authorship offered under the terms of this License. +
  10. + +
  11. +"You" 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. +
  12. + +
  13. "License Elements" means the following high-level +license attributes as selected by Licensor and indicated in the title +of this License: Attribution, ShareAlike.
+ +

2. Fair Use Rights. 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.

+ + +

3. License Grant. 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:

+ + +
    +
  1. +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; +
  2. + +
  3. +to create and reproduce Derivative Works; +
  4. + +
  5. 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; +
  6. + +
  7. to distribute copies or phonorecords of, display publicly, perform +publicly, and perform publicly by means of a digital audio transmission +Derivative Works. +
  8. + +
  9. For the avoidance of doubt, where the work is a musical composition:

    + +
      +
    1. Performance Royalties Under Blanket Licenses. +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.
    2. + +
    3. Mechanical Rights and Statutory Royalties. +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). +
    4. +
    +
  10. + +
  11. Webcasting Rights and Statutory Royalties. 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).
  12. +
+ + +

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.

+ +

4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

+ + +
    +
  1. +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. +
  2. + +
  3. 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. +
  4. + +
  5. 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. +
  6. + + + + +
+ + + + + +

5. Representations, Warranties and Disclaimer

+ +

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.

+ + +

6. Limitation on Liability. 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.

+ +

7. Termination

+ +
    + +
  1. +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. +
  2. + +
  3. 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. +
  4. +
+ +

8. Miscellaneous

+ +
    + +
  1. 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. +
  2. + +
  3. 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. +
  4. + +
  5. 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. +
  6. + +
  7. 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. +
  8. + +
  9. 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. +
  10. +
+ + + +
+ + +

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.

+ + +

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.

+ + +

Creative Commons may be contacted at http://creativecommons.org/.

+ + +
+ + + +
+ + + + +
+ \ 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 0000000..7c50dbc --- /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 0000000..7de342c 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 0000000..d511905 --- /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. + + + Copyright (C) + + 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. + + , 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 0000000..5ab7695 --- /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. + + + Copyright (C) + + 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. + + , 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 0000000..c3a0264 --- /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 + + #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 0000000..521e669 --- /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 0000000..f8719a5 --- /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 + + * 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 0000000..a35b8f8 --- /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 0000000..030dfa9 --- /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 + + * 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 : ++ 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 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 0000000..511a11e --- /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 + + * 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 0000000..ec701ce --- /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 0000000..ca0f2ac --- /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 + +Dan Kegel 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 0000000..ec701ce --- /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 0000000..804a17e --- /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 +To: Nathan Sidwell +Cc: Ian Lance Taylor , 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 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 + + * 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 0000000..967bf7f --- /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 0000000..ca0f2ac --- /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 + +Dan Kegel 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 0000000..97fa6ee --- /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 +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 +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 + + * 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 + + 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 0000000..03f6453 --- /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 +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 + + * 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 0000000..804a17e --- /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 +To: Nathan Sidwell +Cc: Ian Lance Taylor , 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 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 + + * 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 0000000..967bf7f --- /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 0000000..97fa6ee --- /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 +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 +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 + + * 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 + + 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 0000000..4e4934d --- /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 +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 + + * 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 0000000..804a17e --- /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 +To: Nathan Sidwell +Cc: Ian Lance Taylor , 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 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 + + * 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 0000000..c64e74f --- /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 0000000..1c7fa4a --- /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 0000000..dc67d3c --- /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 0000000..e07a7e8 --- /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 0000000..73d5b9d --- /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 0000000..6b8fc41 --- /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 0000000..26e5a12 --- /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 0000000..98fa600 --- /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 0000000..5fe3623 --- /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 0000000..5ae9efe --- /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 0000000..6bf403c --- /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 0000000..804a17e --- /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 +To: Nathan Sidwell +Cc: Ian Lance Taylor , 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 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 + + * 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 0000000..ea6c18f --- /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 0000000..967bf7f --- /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 0000000..bb4a69c --- /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 + + * 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 + + * 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 <>. ++ ++*/ ++ ++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 0000000..bd6ae7a --- /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 0000000..3296201 --- /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" +To: +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 0000000..c6de93a --- /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 0000000..98fa600 --- /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 0000000..0ca9a47 --- /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 +To: Nathan Sidwell +Cc: Ian Lance Taylor , 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 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 + + * 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 0000000..a39050f --- /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 + + * 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 + + * 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 0000000..ea6c18f --- /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 0000000..86e3611 --- /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 0000000..25222e5 --- /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 0000000..be85ceb --- /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 0000000..04a7e61 --- /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 +## 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 0000000..498651a --- /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 +## +## 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 0000000..25222e5 --- /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 0000000..be85ceb --- /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 0000000..04a7e61 --- /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 +## 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 0000000..498651a --- /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 +## +## 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 0000000..25222e5 --- /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 0000000..be85ceb --- /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 0000000..04a7e61 --- /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 +## 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 0000000..498651a --- /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 +## +## 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 0000000..d312403 --- /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 +To: "Robert P. J. Day" +CC: crossgcc list +Subject: Re: cygwin source directory has moved +In-Reply-To: + +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 0000000..00974f6 --- /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= 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= 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 . + + 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 0000000..141de0c --- /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 0000000..fc55681 --- /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 0000000..c8189b5 --- /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 . 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 ." ++ ++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 0000000..44d2a01 --- /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 +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 + + * 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 0000000..fb2b8da --- /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 0000000..1d18055 --- /dev/null +++ b/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde , 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 0000000..0e077ea --- /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 + + #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 0000000..2c5297e --- /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 0000000..170b21d --- /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 ""/' 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 < 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 3.2-7 +- fix calling of C++ destructors in certain cases + +* Tue Sep 3 2002 Jakub Jelinek 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 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 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 3.2-3 +- take advantage of __attribute__((visibility())) on Alpha +- avoid copying tail padding (Jason Merrill) + +* Thu Aug 22 2002 Jakub Jelinek 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 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 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 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 3.2-0.1 +- first attempt for gcc 3.2 +- remove .la files + +* Sat Jul 20 2002 Jakub Jelinek 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 3.1-9 +- define %%_gnu to nothing for compatibility + +* Sat Jul 13 2002 Jakub Jelinek 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 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 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 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 3.1-4 +- rebuilt + +* Sat May 25 2002 Jakub Jelinek 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 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 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 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 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 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 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 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 3.1-0.23.1 +- fix info and man page generation + +* Thu Mar 14 2002 Jakub Jelinek 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 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 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 3.1-0.20 +- update to CVS HEAD + - fix jar (Tom Tromey) + - fix loop unrolling (Richard Henderson) + +* Wed Jan 30 2002 Jakub Jelinek 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 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 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 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 3.1-0.15 +- update to CVS HEAD (fix glibc bootstrap failure) + +* Thu Jan 3 2002 Jakub Jelinek 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 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 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 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 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 3.1-0.9 +- update to CVS HEAD +- make DWARF 2 preferred debugging format on Linux + +* Mon Nov 12 2001 Jakub Jelinek 3.1-0.8 +- don't ship .la files (#56072) +- include libfrtbegin.a (#56098) + +* Mon Nov 12 2001 Jakub Jelinek 3.1-0.7 +- update to CVS HEAD +- back out Nov 7th loop.c change for now + +* Fri Nov 9 2001 Jakub Jelinek 3.1-0.6 +- update to CVS HEAD +- frame unwind compatibility with 7.[12] binutils + +* Tue Nov 6 2001 Jakub Jelinek 3.1-0.5 +- update to CVS HEAD +- merge DW_EH_PE_indirect constants and their relocs + +* Thu Oct 25 2001 Jakub Jelinek 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 3.1-0.3 +- fix inlining of C nested functions with auto prototypes + +* Mon Oct 22 2001 Jakub Jelinek 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 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 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 3.0.1-3 +- don't use #include_next in headers (Benjamin Kosnik, #53262) + +* Wed Sep 5 2001 Jakub Jelinek 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 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 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 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 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 3.0-3 +- fix libgcc_s.so and libstdc++.so symlinks +- don't ship jar + +* Tue Jul 10 2001 Jakub Jelinek 3.0-2 +- move libstdc++.so into gcc-lib +- add libobjc.so symlink + +* Tue Jul 10 2001 Jakub Jelinek 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 0000000..a75042a --- /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 0000000..928f911 --- /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 0000000..bd717f5 --- /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 0000000..4393078 --- /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 0000000..0de46fc --- /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 0000000..db78ba1 --- /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(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl +-dnl The cache variable name. +-define(<>, 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 +-$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 +-#include ], [ +-#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 +-#include ], [ +-#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 <&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 <&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 < + 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 < + 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 < + 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 < + #include +@@ -2601,7 +2714,7 @@ + #include + 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 +@@ -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 +@@ -2657,7 +2770,7 @@ + : + else + cat > conftest.$ac_ext < + #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 <&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 < + 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 <&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 <&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 <&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 <&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 < +@@ -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 < +@@ -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 < +@@ -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 < +@@ -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 < +@@ -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 < +@@ -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 < +@@ -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 < +@@ -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 < + #include +@@ -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 < + #include +@@ -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 <&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 <> 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 <&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 + #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 + #include + #include + +@@ -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 ++#include ++ ++#include ++#include ++ ++/*====================== 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 ++#include ++ ++#include ++ ++#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 ++#ifdef HAVE_MACHINE_ASM_H ++#include ++#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 + ++#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 + #include + +@@ -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 ++ ++ 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 ++#include ++ ++#include ++#include ++ ++/* 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; jgpr[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; inargs; 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; irtype, 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 , %r11 */ ++ tramp[5] = 0xba49; /* mov , %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 + +@@ -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 ++ ++ 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 ++ ++ .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 0000000..e0ccd9f --- /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 + +=================================================================== +--- 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 0000000..4751e9d --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch @@ -0,0 +1,45 @@ +# +# Submitted-By: Marc Kleine-Budde , 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 0000000..aafc130 --- /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 >::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 *, Elem *, binder2nd >)'^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::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 0000000..d647bb2 --- /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 <${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 < +#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 +- version 3.2.2. + +* Tue Feb 19 2002 SUGIOKA Toshinobu +- version 3.0.4. + +* Tue Feb 12 2002 SUGIOKA Toshinobu +- add java support. + +* Thu Feb 7 2002 SUGIOKA Toshinobu +- follow debian/SH update. + +* Tue Feb 5 2002 SUGIOKA Toshinobu +- follow debian/SH update. + +* Thu Jan 24 2002 SUGIOKA Toshinobu +- rebuild with new binutils. + +* Tue Jan 22 2002 SUGIOKA Toshinobu +- leaf function optimization fixed. + +* Thu Dec 06 2001 SUGIOKA Toshinobu +- add gcc-ice-rml patch. + +* Tue Nov 13 2001 SUGIOKA Toshinobu +- add configure option. + +* Thu Nov 01 2001 SUGIOKA Toshinobu +- tablejump fix by gniibe. + +* Mon Oct 22 2001 SUGIOKA Toshinobu +- updated gcc patch. + +* Wed Oct 17 2001 SUGIOKA Toshinobu +- updated gcc patch. + +* Tue Oct 02 2001 SUGIOKA Toshinobu +- gcc/config/sh/sh.c bug fix. + +* Fri Aug 24 2001 SUGIOKA Toshinobu +- gcc version 3.0.1. + +* Thu Jun 28 2001 SUGIOKA Toshinobu +- gcc version 3.0. +- Add libstdc++ package. + +* Mon Apr 23 2001 SUGIOKA Toshinobu +- Add cygwin host. + +* Sat Dec 23 2000 SUGIOKA Toshinobu +- fix file attribute. +- add asmspecs patch. + +* Sat Nov 11 2000 SUGIOKA Toshinobu +- 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 0000000..763b8a1 --- /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 0000000..928f911 --- /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 0000000..1b0715c --- /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 0000000..fb8e4f0 --- /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 0000000..aafc130 --- /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 >::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 *, Elem *, binder2nd >)'^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::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 0000000..ce2baf3 --- /dev/null +++ b/patches/gcc/3.3.1/gcc-3.3.1-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde , 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 0000000..e94c8b9 --- /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 0000000..6ca0525 --- /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 0000000..04882e5 --- /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 0000000..9ab0d32 --- /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 ++ * 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 0000000..f6dedde --- /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 ++ * 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 0000000..ea544b1 --- /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 0000000..f5b0d17 --- /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 ++ * 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 0000000..7f60b95 --- /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 0000000..ee7dfa7 --- /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 0000000..e83f728 --- /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 + +> 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 0000000..efd4243 --- /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 + +Dan Kegel 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 0000000..95e1057 --- /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 0000000..7974a0c --- /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 + diff --git a/patches/gcc/3.3.2/empty6.patch b/patches/gcc/3.3.2/empty6.patch new file mode 100644 index 0000000..1b0715c --- /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 0000000..fb8e4f0 --- /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 0000000..aafc130 --- /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 >::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 *, Elem *, binder2nd >)'^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::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 0000000..9ec6c53 --- /dev/null +++ b/patches/gcc/3.3.2/gcc-3.3.2-arm-bigendian.patch @@ -0,0 +1,65 @@ +By Lennert Buytenhek +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 0000000..c8bc2ea --- /dev/null +++ b/patches/gcc/3.3.2/gcc-3.3.2-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde , 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 0000000..f02b235 --- /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 0000000..195d7f5 --- /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 0000000..b7e0a6b --- /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 0000000..9f17500 --- /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 0000000..cdb9d8e --- /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 0000000..b435126 --- /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 0000000..04a0841 --- /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 0000000..b40aaa0 --- /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 0000000..d9cc3e4 --- /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 ++ ++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 0000000..a8eee16 --- /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 0000000..5c1895a --- /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 0000000..adccc0e --- /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 + +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 +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 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 0000000..2a9d592 --- /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 +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 0000000..7974a0c --- /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 + 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 0000000..928f911 --- /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 0000000..1b0715c --- /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 0000000..9ec6c53 --- /dev/null +++ b/patches/gcc/3.3.3/gcc-3.3.2-arm-bigendian.patch @@ -0,0 +1,65 @@ +By Lennert Buytenhek +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 0000000..437c2a1 --- /dev/null +++ b/patches/gcc/3.3.3/gcc-3.3.3-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde , 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 0000000..e94c8b9 --- /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 0000000..6ca0525 --- /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 0000000..04882e5 --- /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 0000000..9ab0d32 --- /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 ++ * 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 0000000..f6dedde --- /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 ++ * 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 0000000..b45959c --- /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 0000000..ea544b1 --- /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 0000000..f5b0d17 --- /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 ++ * 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 0000000..cb294d5 --- /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 0000000..bb7f171 --- /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 0000000..ce68bb1 --- /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 0000000..7587ad8 --- /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 +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: +List-Id: linux-sh.m17n.org + +At 19:40 03/12/01 +0000, Stuart Menefy wrote: +>On Sat, 29 Nov 2003 20:19:08 +0900 kkojima@rr.iij4u.or.jp wrote: +> +>> Dan Kegel 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 0000000..d9cc3e4 --- /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 ++ ++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 0000000..ceaf957 --- /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 0000000..ee7dfa7 --- /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 0000000..64d4fc4 --- /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 0000000..2a9d592 --- /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 +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 0000000..7974a0c --- /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 + 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 0000000..0816b83 --- /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 0000000..0611e2c --- /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 0000000..4f21be3 --- /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 +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 0000000..9e45943 --- /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 + +=================================================================== +--- 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 0000000..eef35b5 --- /dev/null +++ b/patches/gcc/3.3.4/gcc-3.3.4-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde , 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 0000000..0816b83 --- /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 0000000..0611e2c --- /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 0000000..7936b19 --- /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 +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 0000000..0816b83 --- /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 0000000..0611e2c --- /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 0000000..763b8a1 --- /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 0000000..928f911 --- /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 0000000..0de46fc --- /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 0000000..aafc130 --- /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 >::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 *, Elem *, binder2nd >)'^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::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 0000000..00cfb4c --- /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 + +> 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 0000000..dc94f4c --- /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 0000000..6266c1f --- /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 + +Dan Kegel 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 0000000..189b132 --- /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 +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 0000000..c3c478f --- /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 0000000..a0c9233 --- /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 0000000..870024d --- /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 0000000..c9288c6 --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek +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 0000000..69a79d5 --- /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 , 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 0000000..43eed3e --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric , 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 0000000..2a48c99 --- /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 + + /* 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 0000000..6357f56 --- /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 +To: Dan Kegel , 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 +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 + + * 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 0000000..ce68bb1 --- /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 0000000..6a4265d --- /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 +Subject: [PATCH] Fix PR target/15647 for sh-linux +From: Kaz Kojima +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 + + * 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 0000000..7936b19 --- /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 +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 0000000..2fc805b --- /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" +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 0000000..c9288c6 --- /dev/null +++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek +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 0000000..69a79d5 --- /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 , 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 0000000..43eed3e --- /dev/null +++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric , 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 0000000..2977765 --- /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 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 0000000..f7178c1 --- /dev/null +++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,82 @@ +By Lennert Buytenhek +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 0000000..69a79d5 --- /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 , 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 0000000..43eed3e --- /dev/null +++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric , 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 0000000..7936b19 --- /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 +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 0000000..f7178c1 --- /dev/null +++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,82 @@ +By Lennert Buytenhek +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 0000000..69a79d5 --- /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 , 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 0000000..43eed3e --- /dev/null +++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric , 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 0000000..2977765 --- /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 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 0000000..be3fec9 --- /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 0000000..a438fee --- /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: +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: +List-Post: +List-Help: +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" +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 + + 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 0000000..00ea4ee --- /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 0000000..a97f22b --- /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 +@@ -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 +@@ -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 ++ ++#include ++ ++#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 ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#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 ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // 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 ++ 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 ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ 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(-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(__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:: ++ 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(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(-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(-1) ++ || __conv == static_cast(-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:: ++ 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:: ++ 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:: ++ 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(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(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(-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(-1) ++ || __conv == static_cast(-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 ++ ++#include ++#include ++ ++#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::_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::_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::_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::_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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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 specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(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::__wmask_type ++ ctype::_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::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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:: ++ 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:: ++ 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:: ++ 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:: ++ 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:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ 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(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ 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(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_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(__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(_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 ++ ++#include ++#include ++ ++#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::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(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::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 ++ ++#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 ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ 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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_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; ++ ++ 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(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(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__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::_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; ++ ++ 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(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(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__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::~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::~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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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(__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(__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(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__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::~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 ++ ++#include ++#include ++ ++#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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ 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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#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(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast(__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 ++ ++ template ++ __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 ++ __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 ++ __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 ++ __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::_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:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__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::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::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::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::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__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 ++ ++// 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 0000000..0c41db9 --- /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 0000000..0c37050 --- /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 0000000..27f7c07 --- /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 0000000..142052f --- /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 0000000..4377c21 --- /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 0000000..2977765 --- /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 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 0000000..680bb39 --- /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 0000000..8b98268 --- /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 0000000..6d8021c --- /dev/null +++ b/patches/gcc/3.4.4/73_all_sh-pr20617.patch @@ -0,0 +1,28 @@ +2005-03-24 J"orn Rennecke + + 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 0000000..625e335 --- /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 0000000..a209470 --- /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 0000000..c7419af --- /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 0000000..bfa06a2 --- /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 -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)| ab(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 -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)| ab(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 ++#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 ++@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 0000000..19d1b90 --- /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 , 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 0000000..7936b19 --- /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 +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 0000000..7936b19 --- /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 +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 0000000..f7178c1 --- /dev/null +++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,82 @@ +By Lennert Buytenhek +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 0000000..69a79d5 --- /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 , 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 0000000..43eed3e --- /dev/null +++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric , 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 0000000..2977765 --- /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 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 0000000..8051f31 --- /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 +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 0000000..d9bcffe --- /dev/null +++ b/patches/gcc/4.0.0/gcc-4.0-arm-bigendian.patch @@ -0,0 +1,79 @@ +By Lennert Buytenhek +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 0000000..7ac8ab5 --- /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" +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___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 0000000..7451219 --- /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 0000000..0582d75 --- /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 + + 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 0000000..8c5ffb9 --- /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]': +.../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]' 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 +@@ -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 +@@ -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 + } + + templateget_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 0000000..8051f31 --- /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 +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 0000000..7ac8ab5 --- /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" +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___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 0000000..5e35a1e --- /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]': +.../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]' 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 > >, _ForwardIterator = +__gnu_cxx::__normal_iterator > >]' 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 + +===File ~/patches/gcc-40-4121982.patch====================== +Index: ChangeLog +2005-06-28 Geoffrey Keating + + * 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 0000000..8051f31 --- /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 +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 0000000..7ac8ab5 --- /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" +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___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 0000000..90453fb --- /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 +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 + + * 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 0000000..3be7d09 --- /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 0000000..ac4cf97 --- /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 +@@ -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 ++ ++#include ++ ++#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 ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#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 ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // 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 ++ 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 ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ 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(-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(__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:: ++ 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(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(-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(-1) ++ || __conv == static_cast(-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:: ++ 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:: ++ 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:: ++ 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(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(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(-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(-1) ++ || __conv == static_cast(-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 ++ ++#include ++#include ++ ++#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::_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::_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::_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::_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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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 specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(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::__wmask_type ++ ctype::_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::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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:: ++ 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:: ++ 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:: ++ 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:: ++ 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:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ 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(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ 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(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_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(__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(_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 ++ ++#include ++#include ++ ++#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::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(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::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 ++ ++#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 ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ 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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_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; ++ ++ 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(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::_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; ++ ++ 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(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::~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::~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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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(__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(__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::~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 ++ ++#include ++#include ++ ++#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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ 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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#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 ++ ++ template ++ __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 ++ __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 ++ __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 ++ __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::_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:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__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::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::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::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::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__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 ++ ++// 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 0000000..a9d6e71 --- /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 0000000..0e2092f --- /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 + # 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 0000000..dfb22d6 --- /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 0000000..2ccc80d --- /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 ++#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 0000000..1fac112 --- /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 + #include + ++/* 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 // For uninitialized_copy_n + #include // 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 0000000..c7676ae --- /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 0000000..307aea3 --- /dev/null +++ b/patches/gcc/4.0.3/800-arm-bigendian.patch @@ -0,0 +1,67 @@ +By Lennert Buytenhek +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 0000000..3be7d09 --- /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 0000000..ac4cf97 --- /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 +@@ -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 ++ ++#include ++ ++#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 ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#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 ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // 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 ++ 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 ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ 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(-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(__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:: ++ 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(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(-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(-1) ++ || __conv == static_cast(-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:: ++ 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:: ++ 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:: ++ 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(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(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(-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(-1) ++ || __conv == static_cast(-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 ++ ++#include ++#include ++ ++#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::_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::_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::_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::_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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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 specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(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::__wmask_type ++ ctype::_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::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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:: ++ 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:: ++ 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:: ++ 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:: ++ 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:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ 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(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ 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(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_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(__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(_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 ++ ++#include ++#include ++ ++#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::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(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::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 ++ ++#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 ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ 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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_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; ++ ++ 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(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::_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; ++ ++ 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(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::~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::~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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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(__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(__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::~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 ++ ++#include ++#include ++ ++#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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ 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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#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 ++ ++ template ++ __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 ++ __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 ++ __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 ++ __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::_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:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__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::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::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::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::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__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 ++ ++// 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 0000000..a9d6e71 --- /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 0000000..0e2092f --- /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 + # 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 0000000..dfb22d6 --- /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 0000000..2ccc80d --- /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 ++#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 0000000..1fac112 --- /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 + #include + ++/* 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 // For uninitialized_copy_n + #include // 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 0000000..c7676ae --- /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 0000000..fd2c9bf --- /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 0000000..9ae921e --- /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 0000000..3928705 --- /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 +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 0000000..49d576c --- /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 0000000..1657e7b --- /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 0000000..e5d712e --- /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 +@@ -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 ++ ++#include ++#include ++ ++#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 ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#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 ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // 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 ++ 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 ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ 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(-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(__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:: ++ 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(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(-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(-1) ++ || __conv == static_cast(-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:: ++ 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:: ++ 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:: ++ 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(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(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(-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(-1) ++ || __conv == static_cast(-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 ++ ++#include ++#include ++ ++#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::_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::_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::_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::_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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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 specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(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::__wmask_type ++ ctype::_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::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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:: ++ 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:: ++ 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:: ++ 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:: ++ 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:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ 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(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ 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(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_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(__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(_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 ++ ++#include ++#include ++ ++#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::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(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::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 ++ ++#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 ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ 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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_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; ++ ++ 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(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::_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; ++ ++ 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(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::~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::~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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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(__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(__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::~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 ++ ++#include ++#include ++ ++#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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ 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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#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 ++ ++ template ++ __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 ++ __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 ++ __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 ++ __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::_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:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__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::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::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::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::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__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 ++ ++// 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 0000000..560bcb2 --- /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 0000000..0e2092f --- /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 + # 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 0000000..dfb22d6 --- /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 0000000..2ccc80d --- /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 ++#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 0000000..1fac112 --- /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 + #include + ++/* 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 // For uninitialized_copy_n + #include // 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 0000000..7992282 --- /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 0000000..1fa5ae1 --- /dev/null +++ b/patches/gcc/4.1.1/800-arm-bigendian.patch @@ -0,0 +1,67 @@ +By Lennert Buytenhek +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 0000000..844c9a0 --- /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 0000000..49d576c --- /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 0000000..acebe53 --- /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 0000000..e5d712e --- /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 +@@ -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 ++ ++#include ++#include ++ ++#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 ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#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 ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // 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 ++ 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 ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ 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(-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(__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:: ++ 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(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(-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(-1) ++ || __conv == static_cast(-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:: ++ 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:: ++ 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:: ++ 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(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(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(-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(-1) ++ || __conv == static_cast(-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 ++ ++#include ++#include ++ ++#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::_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::_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::_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::_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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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 specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(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::__wmask_type ++ ctype::_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::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::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:: ++ 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:: ++ 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:: ++ 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:: ++ 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:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ 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(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ 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(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_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(__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(_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 ++ ++#include ++#include ++ ++#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::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(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::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 ++ ++#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 ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ 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 messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ 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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ 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::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_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; ++ ++ 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(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::_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; ++ ++ 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(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::~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::~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 ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#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::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ 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(__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(__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::~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 ++ ++#include ++#include ++ ++#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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ 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:: ++ _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::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#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 ++ ++ template ++ __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 ++ __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 ++ __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 ++ __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::_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:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__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::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::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::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::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__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 ++ ++// 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 0000000..560bcb2 --- /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 0000000..0e2092f --- /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 + # 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 0000000..dfb22d6 --- /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 0000000..2ccc80d --- /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 ++#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 0000000..1fac112 --- /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 + #include + ++/* 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 // For uninitialized_copy_n + #include // 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 0000000..b7d9bb9 --- /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 0000000..7992282 --- /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 0000000..0a94174 --- /dev/null +++ b/patches/gcc/4.1.2/800-arm-bigendian.patch @@ -0,0 +1,127 @@ +By Lennert Buytenhek +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 0000000..2b17d93 --- /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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..8c1b1af --- /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 . 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 ." ++ ++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 0000000..15ed1de --- /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 0000000..0b5c575 --- /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 0000000..b337d0a --- /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 0000000..4005df7 --- /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 0000000..0028d23 --- /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 0000000..8359cc6 --- /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 0000000..db70efb --- /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 + + * 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 0000000..f3bd4ab --- /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 0000000..dde7bf3 --- /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 + #include + #include + #include +@@ -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 0000000..c54d7a2 --- /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 0000000..eb03dd0 --- /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 0000000..2a98ac9 --- /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 0000000..7c03529 --- /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 + + #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 0000000..99ef356 --- /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 0000000..b1269e0 --- /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 +Organization: Siemens AG +To: Jeffrey Bedard , 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 0000000..e04b569 --- /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 0000000..ce88879 --- /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 0000000..3f5e5f0 --- /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 0000000..ddaaa9b --- /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 0000000..a14e1d4 --- /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 0000000..1ed6480 --- /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 0000000..8d9b4fa --- /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 0000000..7f93a4f --- /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 ++ ++ * sysdeps/unix/sysv/linux/sparc/getsysstats.c: New file. ++ ++2000-02-24 Ulrich Drepper ++ ++ * locale/C-ctype.c (_nl_C_LC_CTYPE): Move comma to correct place ++ for big endian machines. ++ ++2000-02-24 Andreas Jaeger ++ ++ * locale/programs/ld-ctype.c (ctype_output): Add missing &. ++ + 2000-02-24 Ulrich Drepper + + * 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 ++ ++ * locale/programs/ld-ctype.c (CTYPE_DATA): Make sure we keep the alignment ++ + 2000-02-22 Ulrich Drepper + + * 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 ++ ++ * timezone/aliases: New file ++ * timezone/Makefile (tzlinks): Add aliases ++ + 2000-02-13 Ulrich Drepper + + * 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 ++ ++ * 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 + + * 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 . Please ++do *not* use the glibcbug script for reporting bugs in the snapshots. ++glibcbug should only be used for problems with the official released versions. ++We don't like bug reports in the bug database because otherwise the impression ++of instability or lack of quality control of glibc as a whole might manifest ++in people's mind. ++ ++Note that since no testing is done on the snapshots, and snapshots may even be ++made when glibc is in an inconsistent state, it may not be unusual for an ++occasional snapshot to have a very obvious bug, such as failure to compile on ++*any* machine. It is likely that such bugs will be fixed by the next ++snapshot, so it really isn't necessary to report them unless they persist for ++a couple of days. ++ ++Missing files should always be reported, since they usually mean there is a ++problem with the snapshot-generating process and we won't know about them ++unless someone tells us. ++ ++Bugs which are non-obvious, such as failure to compile on only a specific ++machine, a new machine dependent or obscure bug (particularly one not detected ++by the testsuite), etc should be reported when you discover them, or have a ++suggested patch to fix them. ++ ++ ++FORMAT FOR PATCHES ++------------------ ++ ++If you have a fix for a bug, or an enhancement to submit, send your patch to ++Ulrich Drepper . Here are some simple guidelines for ++submitting patches: ++ ++ o Use "unified diffs" for patches. A typical command for generating ++ context diffs is "diff -ru glibc-old glibc-patched". ++ ++ o Use the "minimalist approach" for patches. That is, each patch ++ should address only one particular bug, new feature, etc. Do not ++ save up many unrelated changes and submit them all in one big ++ patch, since in general, the larger the patch the more difficult ++ it is for us to decide if the patch is either correct or ++ desirable. And if we find something about the patch that needs ++ to be corrected before it can be installed, we would have to reject ++ the entire patch, which might contain changes which otherwise would ++ be accepted if submitted separately. ++ ++ o Submit a sample ChangeLog entry with your patch. See the existing ++ glibc ChangeLog for examples of what a ChangeLog entry should look ++ like. The emacs command ^X4A will create a ChangeLog entry header ++ for you. ++ ++ ++BUILDING SNAPSHOTS ++------------------ ++ ++The `best' way to build glibc is to use an extra directory, e.g.: ++tar xzf libc-970921.tar.gz ++mkdir build-glibc ++cd build-glibc ++../libc-970921/configure ... ++ ++In this way you can easily clean up (since `make clean' doesn't work at ++the moment) and rebuild glibc. ++ ++ ++NECESSARY TOOLS ++--------------- ++ ++For the recommended versions of gcc, binutils, make, texinfo, gettext, ++autoconf and other tools which might be especially needed when using patches, ++please read the file INSTALL. ++ ++ ++HOW CAN YOU HELP ++---------------- ++ ++It helps already a lot if you just install glibc on your system and try to ++solve any problems. You might want to look at the file `PROJECTS' and help ++with one of those projects, fix some bugs (see `BUGS' or the bug database), ++port to an unsupported platform, ... ++ ++ ++FURTHER DOCUMENTATION ++--------------------- ++ ++A lot of questions are answered in the FAQ. The files `INSTALL', `README' and ++`NOTES' contain the most important documentation. Furthermore glibc has its ++own 700+ pages info documentation, ... ++ ++ ++ ++And finally a word of caution: The libc is one of the most fundamental parts ++of your system - and these snapshots are untested and come without any ++guarantee or warranty. You might be lucky and everything works or you might ++crash your system. If you install a glibc snapshot as primary library, you ++should have a backup somewhere. ++ ++On many systems it is also a problem to replace the libc while the system is ++running. In the worst case on broken OSes some systems crash. On better ++systems you can move the old libc aside but removing it will cause problems ++since there are still processes using this libc image and so you might have to ++check the filesystem to get rid of the libc data. One good alternative (which ++is also safer) is to use a chroot'ed environment. ++ ++Thanks for your help and support. ++ ++Thanks to Fred Fish from Cygnus for the original version of this text ++(for GDB). ++ ++ ++Ulrich Drepper +diff -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 . ++ ++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 , and ++not to the library bug-reporting address. ++ ++The file NOTES contains a description of the feature-test macros used ++in the GNU C library, explaining how you can tell the library what ++facilities you want it to make available. ++ ++We prefer to get bug reports sent using the `glibcbug' shell script which ++is installed together with the rest of the GNU libc to . ++Simply run this shell script and fill in the information. Nevertheless ++you can still send bug reports to as normal electronic ++mails. ++ ++The GNU C Library is free software. See the file COPYING.LIB for copying ++conditions. +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. ++ ++ ++ Copyright (C) ++ ++ 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. ++ ++ , 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * Makefile (extra-objs): Changed stubs.o to gconv_stubs.o. ++ ++Sun Dec 5 11:32:17 1999 H.J. Lu ++ ++ * gconv_stubs.c: Renamed from stubs.c. ++ Support glibc 2.1.x. ++ ++Mon Aug 23 16:42:05 1999 H.J. Lu ++ ++ * 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 ++#include ++ ++/* 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 ++ ++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 ++- 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 ++- add the c_stubs add-on ++- sparc patch from davem ++ ++* Thu Feb 24 2000 Cristian Gafton ++- fix locale problems on 64 bit arches ++ ++* Tue Feb 22 2000 Cristian Gafton ++- cygnus sync up for fixes to nscd ++ ++* Thu Feb 17 2000 Cristian Gafton ++- updated to include new China timezones ++- sync up with the locale changes from Cygnus ++ ++* Tue Feb 01 2000 Cristian Gafton ++- 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 ++- update from cygnus branch ++- compress man pages for the linuxthreads stuff ++ ++* Fri Jan 21 2000 Cristian Gafton ++- add Jakub's patch so we back out even more ++ ++* Thu Jan 20 2000 Cristian Gafton ++- back out the setrlimit changes (well, sort of) ++ ++* Mon Jan 03 2000 Cristian Gafton ++- 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 ++ ++ * stubs.c (__setfpucw): Avoid using _FPU_SETCW on platform that do not have it ++ ++1999-07-08 Cristian Gafton ++ ++ * stubs.c (__setfpucw): New function ++ * Makefile: Use -include, not include ++ (archive): New target. ++ ++ ++1999-04-09 Andreas Jaeger ++ * glibc-compat/Makefile: Add rules to link libnss_*.so.1 to libnss1_*.so.2. ++ ++1998-11-18 Cristian Gafton ++ ++ * shlib-versions: added alpha versions ++ ++ * Makefile (services): Added libnss_dns ++ ++1998-11-16 Cristian Gafton ++ ++ * 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) $(') > $@.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 ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* 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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 ++#include ++#include ++#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 ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++ ++#include "nsswitch.h" ++#include ++ ++/* 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 ++#include ++#include ++#include ++#include ++#include ++#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 ++# 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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 ++#include ++ ++/* 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 ++ ++#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 ++#include ++#include ++#include ++#include ++ ++ ++/* 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 , 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 ++#include ++#include ++#include ++#include ++#include ++#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 ++#include ++#include ++ ++#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 ++#include ++#include ++#include ++ ++/* 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 ++ ++ ++#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 ++ ++#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 ++ ++ ++#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 ++#include ++ ++ ++#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 ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 . ++ ++ 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 ++#include ++#include ++#include ++#include ++#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 ++#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 ++#endif ++#include "libioP.h" ++#include ++ ++#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 ++#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 . ++ ++ 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 ++#include ++#ifdef __STDC__ ++#include ++#endif ++#ifdef _LIBC ++# include ++#endif ++#include ++#include ++ ++#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 ++ ++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 ++ ++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 ++#include ++#include ++ ++/* 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 ++ ++#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 ++** ++*/ ++ ++#ifndef __RPCSVC_YPCLNT_H__ ++#define __RPCSVC_YPCLNT_H__ ++ ++#include ++ ++/* 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 ++ ++/* 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 ++ ++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 ++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 + #include +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 +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 ++ ++ * semaphore.h (SEM_FAILED): Use 0 not NULL. ++ ++2000-02-14 Ulrich Drepper ++ ++ * 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 . ++ ++2000-02-13 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * manager.c (pthread_allocate_stack): Compute guard page address ++ correctly. Patch by HJ Lu. ++ ++2000-01-12 Ulrich Drepper ++ ++ * 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 . ++ ++2000-01-06 Andreas Jaeger ++ ++ * pthread.c: Remove extra initializer. ++ ++2000-01-05 Ulrich Drepper ++ ++ * 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 ++ ++ 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * pthread.c (pthread_initialize): Move getrlimit call after ++ setting of errno. ++ ++1999-12-01 Ulrich Drepper ++ ++ * sysdeps/i386/pt-machine.h: Move stack_pointer definition to the ++ beginning. ++ * sysdeps/i386/i686/pt-machine.h: Likewise. ++ Patches by Alan Modra . ++ ++1999-11-23 Ulrich Drepper ++ ++ * manager.c (pthread_start_thread_event): Initialize p_pid already ++ here. ++ ++1999-11-22 Ulrich Drepper ++ ++ * 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 ++ ++ * pthread.c (__pthread_initialize_manager): Initialize ++ __pthread_manager_thread.p_tid. ++ ++1999-11-02 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * internals.h: Add __new_sem_post to get prototype in ++ manager.c; include semaphore.h for needed types. ++ ++1999-10-08 Ulrich Drepper ++ ++ * 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 ++ ++ * condvar.c (pthread_cond_timedwait_relative): Never return with ++ EINTR. Patch by Andreas Schwab. ++ ++1999-09-19 Ulrich Drepper ++ ++ * 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 ++ ++ * specific.c: Move definitions of struct pthread_key_struct and ++ destr_function to ... ++ * internals.h: ...here. ++ ++1999-09-03 Andreas Schwab ++ ++ * 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 ++ ++ * signals.c (pthread_sighandler): Add SIGCONTEXT_EXTRA_ARGS to ++ call to signal handler. ++ ++1999-08-20 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * Versions [ld.so] (GLIBC_2.0): Export __libc_internal_tsd_get and ++ __libc_internal_tsd_set. ++ ++1999-07-29 Andreas Jaeger ++ ++ * manager.c: Remove inclusion of since it's not ++ needed anymore. ++ ++1999-07-16 Andreas Jaeger ++ ++ * internals.h: Align _pthread_descr_struct to 32 bytes. ++ Reported by Tim Hockin , close PR libc/1206. ++ ++1999-07-09 Ulrich Drepper ++ ++ * manager.c (pthread_handle_create): Free mmap region after stack ++ if clone failed. Patch by Kaz Kylheku . ++ ++1999-07-09 Cristian Gafton ++ ++ * 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 ++ ++ * 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 ++ ++ * man/pthread_cond_init.man: Correct example. ++ Reported by Tomas Berndtsson . ++ ++ * linuxthreads.texi (Condition Variables): Likewise. ++ ++1999-05-18 Jakub Jelinek ++ ++ * 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 ++ ++ * 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 ++ ++ * sysdeps/sparc/sparc64/pt-machine.h (__compare_and_swap): cas ++ instruction does not allow memory element to use offset. ++ ++1999-04-28 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * manager.c (pthread_allocate_stack): Set ++ __pthread_nonstandard_stacks if user-specified stack is used. ++ ++1999-01-16 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * linuxthreads.texi: Remove pointers from first @node. Move old ++ @node spec inside comment. ++ ++1998-12-31 Ulrich Drepper ++ ++ * sysdeps/pthread/bits/stdio-lock.h: Define _IO_lock_lock and ++ _IO_lock_unlock. ++ ++1998-12-29 Ulrich Drepper ++ ++ * semaphore.c (sem_trywait): Don't forget to unlock the semaphore ++ lock. Patch by Bernd Schmidt . ++ ++1998-12-21 Ulrich Drepper ++ ++ * 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 ++ ++ * spinlock.c (__pthread_unlock): Don't crash if called for an ++ untaken mutex. Reported by Ruslan V. Brushkoff . ++ ++ * Examples/ex6.c: Unbuffer stdout and reduce sleep time to reduce ++ overall runtime. ++ ++1998-12-13 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * pthread.c (__pthread_sig_restart): Initiliaze to 0 if ++ SIGRTMIN is defined. ++ (__pthread_sig_cancel): Likewise. ++ ++1998-12-01 Andreas Jaeger ++ ++ * wrapsyscall.c: Include for msync, ++ for system and for tcdrain prototype. ++ Correct msync declaration. ++ ++1998-11-29 Roland McGrath ++ ++ * 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 ++ ++ * internals.h: Include , not . ++ * 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 ++ ++ * 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 ++ ++ * linuxthreads.texi: Fix punctuation after xref. ++ ++1998-11-10 H.J. Lu ++ ++ * sysdeps/unix/sysv/linux/bits/local_lim.h: Undefine NR_OPEN ++ if it is defined in . ++ ++1998-10-29 14:28 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * semaphore.h: Include so that _pthread_descr ++ is declared. ++ ++1998-09-15 David S. Miller ++ ++ * 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 ++ ++ * linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h: Add ++ multiple inclusion guard. ++ ++1998-09-02 11:08 Andreas Schwab ++ ++ * signals.c (sigaction): Check that sig is less than NSIG to avoid ++ array index overflow. ++ ++1998-09-06 10:56 Ulrich Drepper ++ ++ * sysdeps/pthread/semaphore.h: New file. ++ ++1998-09-06 09:08 Ulrich Drepper ++ ++ * sysdeps/pthread/bits/libc-lock.h (enum __libc_tsd_key_t): Add ++ _LIBC_TSD_KEY_DL_ERROR. ++ ++1998-08-31 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * sysdeps/powerpc/pt-machine.h: Remove testandset, it's not used ++ and wastes space; correct types. ++ ++1998-08-08 11:18 H.J. Lu ++ ++ * signals.c (sigaction): Handle NULL argument. ++ ++1998-08-04 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/bits/sigthread.h: Use __sigset_t instead ++ of sigset_t. ++ ++1998-08-02 Andreas Schwab ++ ++ * Makefile (linuxthreads-version): Extract correct number from ++ Banner. ++ ++1998-07-29 Xavier Leroy ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * attr.c (pthread_attr_setschedpolicy): Don't check whether caller ++ is root. ++ ++1998-07-14 19:38 Ulrich Drepper ++ ++ * sysdeps/pthread/bits/libc-lock.h: Define __libc_cleanup_end. ++ ++1998-07-11 Andreas Jaeger ++ ++ * Examples/ex6.c: Include for usleep. ++ ++1998-06-13 11:04 Andreas Schwab ++ ++ * Examples/ex4.c (main): Use exit, not pthread_exit. ++ ++1998-07-09 13:39 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * Versions: Add pthread_attr_init to GLIBC_2.1 version in libc. ++ ++1998-07-01 Andreas Jaeger ++ ++ * attr.c: Include . ++ ++1998-06-30 11:47 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * manager.c (pthread_free): Undo patch from 980430. ++ Reported by David Wragg . ++ ++1998-06-09 15:07 Ulrich Drepper ++ ++ * 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 ++ ++ * sysdeps/pthread/bits/libc-lock.h: Optimize cleanup handlers a bit. ++ ++1998-06-03 Andreas Jaeger ++ ++ * attr.c: Correct typo. ++ ++1998-05-01 Ulrich Drepper ++ ++ * manager.c (pthread_free): Unmap guard before the stack. ++ Patch by Matthias Urlichs. ++ ++1998-04-30 Ulrich Drepper ++ ++ * manager.c (pthread_free): Detect already free child. ++ Patch by Xavier Leroy, reported by Matthias Urlichs. ++ ++1998-04-23 Andreas Schwab ++ ++ * Makefile (linuxthreads-version): Renamed back from ++ libpthread-version. ++ ++1998-04-21 Ulrich Drepper ++ ++ * ptlongjmp.c: Add prototypes for __libc_siglongjmp and ++ __libc_longjmp. ++ ++1998-04-20 14:55 Ulrich Drepper ++ ++ * 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 . ++ ++1998-03-16 Andreas Schwab ++ ++ * manager.c (__pthread_manager): Reduce first argument to select ++ to include just the needed file descriptor. ++ ++1998-03-17 00:06 Ulrich Drepper ++ ++ * manager.c: Fix last patch which caused core dumps. ++ ++ * pthread.c: Correctly handle missing SIGRTMIN. ++ ++1998-03-15 Andreas Schwab ++ ++ * 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 ++ ++ * weaks.c: Define pthread_attr_init as GLIBC_2.0 and GLIBC_2.1. ++ ++1998-03-13 00:46 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 . ++ ++ * 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 ++ ++ * 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 ++ ++ * sysdeps/arm/pt-machine.h: New file; add ARM support. ++ * sysdeps/arm/Implies: likewise. ++ * README: Document it. ++ ++1997-12-13 Andreas Schwab ++ ++ * signals.c: Remove unneeded initializer for sigwaited, saving a ++ warning. ++ ++1997-04-11 01:18 Andreas Schwab ++ ++ * semaphore.c (sem_init): Set sem_spinlock only if available. ++ ++1997-12-04 01:48 Ulrich Drepper ++ ++ * 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 ++ ++ * pthread.c (__pthread_reset_main_thread): Close pipe only if still ++ open. ++ ++1997-10-29 05:38 Ulrich Drepper ++ ++ * wrapsyscall.c: Add socket functions which are also cancelation ++ points. ++ ++1997-10-19 21:40 Wolfram Gloger ++ ++ * 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 ++ ++ * semaphore.h: Add __BEGIN_DECLS/__END_DECLS. ++ Reported by Ralf Corsepius . ++ ++1997-08-29 03:05 Ulrich Drepper ++ ++ * 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 ++ ++ 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 ++ ++ * 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 ++ ++ Initial sparc64-linux support: ++ * linuxthreads/sysdeps/sparc64/Implies: New file. ++ * linuxthreads/sysdeps/sparc64/pt-machine.h: Likewise. ++ ++1997-06-29 00:48 Ulrich Drepper ++ ++ * semaphore.c: Include spinlock.h at correct place. ++ Patch by HJ Lu. ++ ++1997-06-13 10:06 Richard Henderson ++ ++ 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: -> . ++ * semaphore.h: Likewise. ++ ++ * Makefile: (headers): foo.h -> bits/foo.h. ++ * sysdeps/pthread/Makefile: Likewise. ++ ++1997-04-11 01:18 Andreas Schwab ++ ++ * 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 ++ ++ 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 ++ ++ * restart.h (suspend): Clear p_signal before suspending. ++ (suspend_with_cancellation): Likewise. ++ Patch by Xavier Leroy . ++ ++ * 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 ++ ++ * sysdeps/sparc/pt-machine (RELEASE): Fix. ++ ++1997-03-01 07:55 Geoff Keating ++ ++ * sysdeps/powerpc/Implies: Added. ++ * sysdeps/powerpc/pt-machine.h: Added. ++ * sysdeps/powerpc/semaphorebits.h: Added. ++ ++1997-01-22 01:22 Ulrich Drepper ++ ++ * linuxtheads/pthread.c (__pthread_initial_thread): Correct ++ initializer. ++ (__pthread_manager_thread): Likewise. ++ Reported by Andreas Jaeger. ++ ++1997-01-18 22:15 Richard Henderson ++ ++ 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 ++#include ++#include ++#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 ++#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 ++#include ++#include ++#include ++#include ++#include ++ ++/* 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 ++#include ++#include ++#include ++#include ++ ++/* 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 ++#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 ++#include ++#include ++#include ++#include ++ ++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 @@ ++ ++ ++LinuxThreads Frequently Asked Questions ++ ++ ++

LinuxThreads Frequently Asked Questions
++ (with answers)

++

[For LinuxThreads version 0.8]

++ ++

++ ++A. The big picture
++B. Getting more information
++C. Issues related to the C library
++D. Problems, weird behaviors, potential bugs
++E. Missing functions, wrong types, etc
++F. C++ issues
++G. Debugging LinuxThreads programs
++H. Compiling multithreaded code; errno madness
++I. X-Windows and other libraries
++J. Signals and threads
++K. Internals of LinuxThreads

++ ++


++

++ ++

A. The big picture

++ ++

A.1: What is LinuxThreads?

++ ++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 C). ++

++ ++

A.2: What are threads?

++ ++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.

++ ++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.

++ ++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.

++ ++

A.3: What is POSIX 1003.1c?

++ ++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.

++ ++

A.4: What is the status of LinuxThreads?

++ ++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 J). 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.

++ ++

A.5: How stable is LinuxThreads?

++ ++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 C).

++ ++


++

++ ++

B. Getting more information

++ ++

B.1: What are good books and other sources of ++information on POSIX threads?

++ ++The FAQ for comp.programming.threads lists several books: ++http://www.serpentine.com/~bos/threads-faq/.

++ ++There are also some online tutorials. Follow the links from the ++LinuxThreads web page: ++http://pauillac.inria.fr/~xleroy/linuxthreads.

++ ++

B.2: I'd like to be informed of future developments on ++LinuxThreads. Is there a mailing list for this purpose?

++ ++I post LinuxThreads-related announcements on the newsgroup ++comp.os.linux.announce, ++and also on the mailing list ++linux-threads@magenet.com. ++You can subscribe to the latter by writing ++majordomo@magenet.com.

++ ++

B.3: What are good places for discussing ++LinuxThreads?

++ ++For questions about programming with POSIX threads in general, use ++the newsgroup ++comp.programming.threads. ++Be sure you read the ++FAQ ++for this group before you post.

++ ++For Linux-specific questions, use ++comp.os.linux.development.apps ++and comp.os.linux.development.kernel. ++The latter is especially appropriate for questions relative to the ++interface between the kernel and LinuxThreads.

++ ++

B.4: How should I report a possible bug in ++LinuxThreads?

++ ++If you're using glibc 2, the best way by far is to use the ++glibcbug script to mail a bug report to the glibc ++maintainers.

++ ++If you're using an older libc, or don't have the glibcbug ++script on your machine, then e-mail me directly ++(Xavier.Leroy@inria.fr).

++ ++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.

++ ++

B.5: I'd like to read the POSIX 1003.1c standard. Is ++it available online?

++ ++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.

++ ++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, Programming ++with POSIX threads (Addison-Wesley). Butenhof was part of the ++POSIX committee and also designed the Digital Unix implementations of ++POSIX threads, and it shows.

++ ++Another good source of information is the X/Open Group Single Unix ++specification which is available both ++on-line ++and as a ++book and CD/ROM. ++That specification includes pretty much all the POSIX standards, ++including 1003.1c, with some extensions and clarifications.

++ ++


++

++ ++

C. Issues related to the C library

++ ++

C.1: Which version of the C library should I use ++with LinuxThreads?

++ ++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.

++ ++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.

++ ++

C.2: My system has libc 5 preinstalled, not glibc ++2. Can I still use LinuxThreads?

++ ++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.

++ ++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.

++ ++

C.3: So, should I switch to glibc 2, or stay with a ++recent libc 5?

++ ++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.

++ ++Switching an already installed ++system from libc 5 to glibc 2 is not completely straightforward. ++See the Glibc2 ++HOWTO for more information. Much easier is (re-)installing a ++Linux distribution based on glibc 2, such as RedHat 6.

++ ++

C.4: Where can I find glibc 2 and the version of ++LinuxThreads that goes with it?

++ ++On prep.ai.mit.edu and its many, many mirrors around the world. ++See http://www.gnu.org/order/ftp.html ++for a list of mirrors.

++ ++

C.5: Where can I find libc 5 and the version of ++LinuxThreads that goes with it?

++ ++For libc 5, see ftp://sunsite.unc.edu/pub/Linux/devel/GCC/.

++ ++For the libc 5 version of LinuxThreads, see ++ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/.

++ ++

C.6: How can I recompile the glibc 2 version of the ++LinuxThreads sources?

++ ++You must transfer the whole glibc sources, then drop the LinuxThreads ++sources in the linuxthreads/ 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. ++

++ ++

C.7: What is the correspondence between LinuxThreads ++version numbers, libc version numbers, and RedHat version ++numbers?

++ ++Here is a summary. (Information on Linux distributions other than ++RedHat are welcome.)

++ ++ ++ ++ ++ ++ ++ ++
LinuxThreads C library RedHat
0.7, 0.71 (for libc 5) libc 5.x RH 4.2
0.7, 0.71 (for glibc 2) glibc 2.0.x RH 5.x
0.8 glibc 2.1.1 RH 6.0
0.8 glibc 2.1.2 not yet released
++

++ ++


++

++ ++

D. Problems, weird behaviors, potential bugs

++ ++

D.1: When I compile LinuxThreads, I run into problems in ++file libc_r/dirent.c

++ ++You probably mean: ++
++        libc_r/dirent.c:94: structure has no member named `dd_lock'
++
++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 (/usr/include/*). Make sure ++you're using a supported version of the libc 5 library. (See question C.2).

++ ++

D.2: When I compile LinuxThreads, I run into problems with ++/usr/include/sched.h: there are several occurrences of ++_p that the C compiler does not understand

++ ++Yes, /usr/include/sched.h that comes with libc 5.3.12 is broken. ++Replace it with the sched.h file contained in the ++LinuxThreads distribution. But really you should not be using libc ++5.3.12 with LinuxThreads! (See question C.1.)

++ ++

D.3: My program does fdopen() on a file ++descriptor opened on a pipe. When I link it with LinuxThreads, ++fdopen() always returns NULL!

++ ++You're using one of the buggy versions of libc (5.3.12, 5.4.7., etc). ++See question C.1 above.

++ ++

D.4: My program creates a lot of threads, and after ++a while pthread_create() no longer returns!

++ ++This is known bug in the version of LinuxThreads that comes with glibc ++2.1.1. An upgrade to 2.1.2 is recommended.

++ ++

D.5: When I'm running a program that creates N ++threads, top or ps ++display N+2 processes that are running my program. What do all these ++processes correspond to?

++ ++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 pthread_create. 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. ++ ++

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?

++ ++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.

++ ++In LinuxThreads 0.8 and up, pthread_unlock 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.

++ ++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 SCHED_RR and ++SCHED_FIFO, which have precisely defined scheduling ++behaviors.

++ ++

D.7: I have a simple test program with two threads ++that do nothing but printf() in tight loops, and from the ++printout it seems that only one thread is running, the other doesn't ++print anything!

++ ++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.

++ ++The reason for this behavior is explained in ++question D.6 above: printf() performs ++locking on stdout, and thus your two threads contend very ++heavily for the mutex associated with stdout. But if you ++do some real work between two calls to printf(), you'll ++see that scheduling becomes much smoother.

++ ++

D.8: I've looked at <pthread.h> ++and there seems to be a gross error in the pthread_cleanup_push ++macro: it opens a block with { but does not close it! ++Surely you forgot a } at the end of the macro, right? ++

++ ++Nope. That's the way it should be. The closing brace is provided by ++the pthread_cleanup_pop macro. The POSIX standard ++requires pthread_cleanup_push and ++pthread_cleanup_pop to be used in matching pairs, at the ++same level of brace nesting. This allows ++pthread_cleanup_push to open a block in order to ++stack-allocate some data structure, and ++pthread_cleanup_pop to close that block. It's ugly, but ++it's the standard way of implementing cleanup handlers.

++ ++

D.9: I tried to use real-time threads and my program ++loops like crazy and freezes the whole machine!

++ ++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.

++ ++The problem is fixed in LinuxThreads 0.8.

++ ++

D.10: My application needs to create thousands of ++threads, or maybe even more. Can I do this with ++LinuxThreads?

++ ++No. You're going to run into several hard limits: ++
    ++
  • 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 NR_TASKS in include/linux/tasks.h ++and recompiling the kernel. On the x86 processors at least, ++architectural constraints seem to limit NR_TASKS to 4090 ++at most. ++
  • LinuxThreads contains a table of all active threads. This table ++has room for 1024 threads at most. To increase this limit, you must ++change PTHREAD_THREADS_MAX in the LinuxThreads sources ++and recompile. ++
  • 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 setstackaddr ++attribute. ++
  • 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. ++
++(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.

++ ++


++

++ ++

E. Missing functions, wrong types, etc

++ ++

E.1: Where is pthread_yield() ? How ++comes LinuxThreads does not implement it?

++ ++Because it's not part of the (final) POSIX 1003.1c standard. ++Several drafts of the standard contained pthread_yield(), ++but then the POSIX guys discovered it was redundant with ++sched_yield() and dropped it. So, just use ++sched_yield() instead. ++ ++

E.2: I've found some type errors in ++<pthread.h>. ++For instance, the second argument to pthread_create() ++should be a pthread_attr_t, not a ++pthread_attr_t *. Also, didn't you forget to declare ++pthread_attr_default?

++ ++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.

++ ++

E.3: I'm porting an application from Solaris and I ++have to rename all thread functions from thr_blah to ++pthread_blah. This is very annoying. Why did you change ++all the function names?

++ ++POSIX did it. The thr_* functions correspond to Solaris ++threads, an older thread interface that you'll find only under ++Solaris. The pthread_* 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.

++ ++

E.4: How can I suspend and resume a thread from ++another thread? Solaris has the thr_suspend() and ++thr_resume() functions to do that; why don't you?

++ ++The POSIX standard provides no 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.

++ ++Notice that thr_suspend() 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.

++ ++If you really must suspend a thread in LinuxThreads, you can send it a ++SIGSTOP signal with pthread_kill. Send ++SIGCONT 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 SIGSTOP signal! ++One day, LinuxThreads will implement that behavior, and the ++non-portable hack with SIGSTOP won't work anymore.

++ ++

E.5: Does LinuxThreads implement ++pthread_attr_setstacksize() and ++pthread_attr_setstackaddr()?

++ ++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.

++ ++Even if pthread_attr_setstacksize() and ++pthread_attr_setstackaddr() 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.

++ ++

E.6: LinuxThreads does not support the ++PTHREAD_SCOPE_PROCESS value of the "contentionscope" ++attribute. Why?

++ ++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 ++PTHREAD_SCOPE_PROCESS. ++ ++

E.7: LinuxThreads does not implement process-shared ++mutexes, conditions, and semaphores. Why?

++ ++This is another optional component of the POSIX standard. Portable ++applications should test _POSIX_THREAD_PROCESS_SHARED ++before using this facility. ++

++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 mmap()ed files). ++

++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. ++

++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: ++

    ++
  • allow sharing between processes having different UIDs ++
  • supports cancellation ++
  • supports pthread_cond_timedwait ++
++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 ++clone()" fails. ++

++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. ++

++ ++


++

++ ++

F. C++ issues

++ ++

F.1: Are there C++ wrappers for LinuxThreads?

++ ++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 ++http://www.cs.wustl.edu/~schmidt/ACE.html

++ ++

F.2: I'm trying to use LinuxThreads from a C++ ++program, and the compiler complains about the third argument to ++pthread_create() !

++ ++You're probably trying to pass a class member function or some ++other C++ thing as third argument to pthread_create(). ++Recall that pthread_create() is a C function, and it must ++be passed a C function as third argument.

++ ++

F.3: I'm trying to use LinuxThreads in conjunction ++with libg++, and I'm having all sorts of trouble.

++ ++>From what I understand, thread support in libg++ is completely broken, ++especially with respect to locking of iostreams. H.J.Lu wrote: ++
++If you want to use thread, I can only suggest egcs and glibc. You ++can find egcs at ++http://www.cygnus.com/egcs. ++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. ++
++
++

++ ++

G. Debugging LinuxThreads programs

++ ++

G.1: Can I debug LinuxThreads program using gdb?

++ ++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 ++http://www.gr.opengroup.org/java/jdk/linux/debug.htm. ++Precompiled binaries of the patched gdb are available in RedHat's RPM ++format at http://odin.appliedtheory.com/.

++ ++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.

++ ++

G.2: Does it work with post-mortem debugging?

++ ++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. ++ ++

G.3: Any other ways to debug multithreaded programs, then?

++ ++Assertions and printf() are your best friends. Try to debug ++sequential parts in a single-threaded program first. Then, put ++printf() statements all over the place to get execution traces. ++Also, check invariants often with the assert() 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.

++ ++


++

++ ++

H. Compiling multithreaded code; errno madness

++ ++

H.1: You say all multithreaded code must be compiled ++with _REENTRANT defined. What difference does it make?

++ ++It affects include files in three ways: ++
    ++
  • The include files define prototypes for the reentrant variants of ++some of the standard library functions, ++e.g. gethostbyname_r() as a reentrant equivalent to ++gethostbyname().

    ++ ++

  • If _REENTRANT is defined, some ++<stdio.h> functions are no longer defined as macros, ++e.g. getc() and putc(). In a multithreaded ++program, stdio functions require additional locking, which the macros ++don't perform, so we must call functions instead.

    ++ ++

  • More importantly, <errno.h> redefines errno when ++_REENTRANT is ++defined, so that errno refers to the thread-specific errno location ++rather than the global errno variable. This is achieved by the ++following #define in <errno.h>: ++
    ++        #define errno (*(__errno_location()))
    ++
    ++which causes each reference to errno to call the ++__errno_location() function for obtaining the location ++where error codes are stored. libc provides a default definition of ++__errno_location() that always returns ++&errno (the address of the global errno variable). Thus, ++for programs not linked with LinuxThreads, defining ++_REENTRANT makes no difference w.r.t. errno processing. ++But LinuxThreads redefines __errno_location() 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. ++
++

++ ++

H.2: Why is it so important that each thread has its ++own errno variable?

++ ++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.

++ ++

H.3: What happens if I link LinuxThreads with code ++not compiled with -D_REENTRANT?

++ ++Lots of trouble. If the code uses getc() or ++putc(), 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: ++
++        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 (...);
++
++Assume this code is not compiled with -D_REENTRANT, and ++linked with LinuxThreads. At run-time, read() is ++interrupted. Since the C library was compiled with ++-D_REENTRANT, read() stores its error code ++in the location pointed to by __errno_location(), which ++is the thread-local errno variable. Then, the code above sees that ++read() returns -1 and looks up errno. Since ++_REENTRANT 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.

++ ++

H.4: With LinuxThreads, I can no longer use the signals ++SIGUSR1 and SIGUSR2 in my programs! Why?

++ ++The short answer is: because the Linux kernel you're using does not ++support realtime signals.

++ ++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.

++ ++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: ++SIGUSR1 and SIGUSR2. So, LinuxThreads has ++no choice but use those two signals.

++ ++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 SIGUSR1 and SIGUSR2 ++free for user code. (This works only with glibc, not with libc 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? ++

++ ++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.

++ ++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.

++ ++


++

++ ++

I. X-Windows and other libraries

++ ++

I.1: My program uses both Xlib and LinuxThreads. ++It stops very early with an "Xlib: unknown 0 error" message. What ++does this mean?

++ ++That's a prime example of the errno problem described in question H.2. The binaries for Xlib you're using have not been ++compiled with -D_REENTRANT. It happens Xlib contains a ++piece of code very much like the one in question H.2. So, your Xlib fetches the error code from the ++wrong errno location and concludes that an error it cannot handle ++occurred.

++ ++

I.2: So, what can I do to build a multithreaded X ++Windows client?

++ ++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.

++ ++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 README.Xfree3.3 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.

++ ++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 -D_REENTRANT ++still "sees" the right error values if it executes in the main thread ++only.

++ ++

This is a lot of work. Don't you have precompiled ++thread-safe X libraries that you could distribute?

++ ++No, I don't. Sorry. But consider installing a Linux distribution ++that comes with thread-safe X libraries, such as RedHat 6.

++ ++

I.3: Can I use library FOO in a multithreaded ++program?

++ ++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 -D_REENTRANT to avoid ++the errno problems explained in question H.2. ++

++ ++

I.4: What if I make sure that only one thread calls ++functions in these libraries?

++ ++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 -D_REENTRANT is needed. ++

++ ++

I.5: What if I make sure that only the main thread ++calls functions in these libraries?

++ ++That might actually work. As explained in question I.1, ++the main thread uses the global errno variable, and can therefore ++execute code not compiled with -D_REENTRANT.

++ ++

I.6: SVGAlib doesn't work with LinuxThreads. Why? ++

++ ++Because both LinuxThreads and SVGAlib use the signals ++SIGUSR1 and SIGUSR2. See question H.4. ++

++ ++ ++


++

++ ++

J. Signals and threads

++ ++

J.1: When it comes to signals, what is shared ++between threads and what isn't?

++ ++Signal handlers are shared between all threads: when a thread calls ++sigaction(), it sets how the signal is handled not only ++for itself, but for all other threads in the program as well.

++ ++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 pthread_create(). But afterwards, the new thread ++can modify its signal mask independently of its creator thread.

++ ++

J.2: When I send a SIGKILL to a ++particular thread using pthread_kill, all my threads are ++killed!

++ ++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 SIGKILL or SIGINT ++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 SIGINT signal. ++(This assumes default behavior for those signals; see question ++J.3 if you install handlers for those signals.)

++ ++If you're trying to terminate a thread without bringing the whole ++process down, use pthread_cancel().

++ ++

J.3: I've installed a handler on a signal. Which ++thread executes the handler when the signal is received?

++ ++If the signal is generated by a thread during its execution (e.g. a ++thread executes a division by zero and thus generates a ++SIGFPE signal), then the handler is executed by that ++thread. This also applies to signals generated by ++raise().

++ ++If the signal is sent to a particular thread using ++pthread_kill(), then that thread executes the handler.

++ ++If the signal is sent via kill() 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.

++ ++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.

++ ++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.

++ ++

J.3: How shall I go about mixing signals and threads ++in my program?

++ ++The less you mix them, the better. Notice that all ++pthread_* 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 pthread_* function from a signal handler! ++

++ ++The only sensible things you can do from a signal handler is set a ++global flag, or call sem_post on a semaphore, to record ++the delivery of the signal. The remainder of the program can then ++either poll the global flag, or use sem_wait() and ++sem_trywait() on the semaphore.

++ ++Another option is to do nothing in the signal handler, and dedicate ++one thread (preferably the initial thread) to wait synchronously for ++signals, using sigwait(), and send messages to the other ++threads accordingly. ++ ++

J.4: When one thread is blocked in ++sigwait(), other threads no longer receive the signals ++sigwait() is waiting for! What happens?

++ ++It's an unfortunate consequence of how LinuxThreads implements ++sigwait(). 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.

++ ++Though surprising, this behavior actually seems to conform to the ++POSIX standard. According to POSIX, sigwait() 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 sigwait(), ++which would make sigwait() useless). In this particular ++case, the problem described in this question does not appear.

++ ++One day, sigwait() will be implemented in the kernel, ++along with others POSIX 1003.1b extensions, and sigwait() ++will have a more natural behavior (as well as better performances).

++ ++


++

++ ++

K. Internals of LinuxThreads

++ ++

K.1: What is the implementation model for ++LinuxThreads?

++ ++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 ++clone() system call, which is a generalization of ++fork() allowing the new process to share the memory ++space, file descriptors, and signal handlers of the parent.

++ ++Advantages of the "one-to-one" model include: ++

    ++
  • minimal overhead on CPU-intensive multiprocessing (with ++about one thread per processor); ++
  • minimal overhead on I/O operations; ++
  • a simple and robust implementation (the kernel scheduler does ++most of the hard work for us). ++
++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.

++ ++

K.2: Have you considered other implementation ++models?

++ ++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. ++

++ ++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.

++ ++


++
Xavier.Leroy@inria.fr
++ ++ +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 ) ++ * per-thread errno variable (define _REENTRANT before including ) ++ * 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 ++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 +++#else ++ #include ++ #include +++#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 ++#include ++#include ++#include ++#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 ++#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 ++#include ++#include ++#include ++#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 ++#include ++#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 /* for _LIBC_TSD_KEY_N */ ++#include ++#include ++#include ++#include ++#include ++#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 ++#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 ++#include ++#include ++#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 ++#include ++#include ++ ++#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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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_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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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 ++ ++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 ++ ++.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_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 ++ ++.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 ++ ++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 ++ ++.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_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 ++ +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_t pthread_self(void); ++ ++.SH DESCRIPTION ++!pthread_self! return the thread identifier for the calling thread. ++ ++.SH AUTHOR ++Xavier Leroy ++ ++.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 ++ ++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 ++ ++.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 ++.br ++#include ++ ++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 ++ ++.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 ++ ++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 ++ ++.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() { ++ 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include /* for poll */ ++#include /* for mmap */ ++#include ++#include ++#include /* 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 ++#include ++#include ++#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 ++ ++/* 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 ++#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 +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 ++#include ++#include ++#include ++#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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ ++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 ++#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 ++ ++/* 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 ++ and Ulrich Drepper , 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 ++#include ++#include ++#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 ++#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 ++#include ++ ++#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 ++#include ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include ++#include ++ ++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 ++#include ++#include ++#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 ++#include ++#include ++#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 . ++ ++ 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 ++ ++ ++/* 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 . ++ ++ 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 . ++ ++ 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 . ++ ++ 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 . ++ ++ 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 /* 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 . ++ ++ 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 . ++ Based on the Alpha version by Richard Henderson . ++ ++ 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 ++ ++/* 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 directly; use instead." ++#endif ++ ++#ifndef _BITS_PTHREADTYPES_H ++#define _BITS_PTHREADTYPES_H 1 ++ ++#define __need_schedparam ++#include ++ ++/* 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 ++ ++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 ++ ++#include ++#include ++ ++#define __need_sigset_t ++#include ++#include ++ ++ ++__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 ++ ++ ++/* 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 +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 . ++ ++ 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 . ++ ++ 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 ++ ++/* 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 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 ++#include ++#include ++ ++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 , 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++#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 ++ ++ * td_thr_getgregs.c: Correct size parameter of memset call. ++ ++1999-12-02 Ulrich Drepper ++ ++ * proc_service.h: Fix typoes in last added declaractions. ++ ++1999-12-01 Ulrich Drepper ++ ++ * proc_service.h: Add ps_pstop, ps_pcontinue, ps_lstop, and ++ ps_lcontinue prototypes. ++ ++1999-11-23 Ulrich Drepper ++ ++ * Makefile: Correct dependency for shared object. ++ ++1999-11-22 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * td_thr_get_info.c: Make sure ti_lid is never zero. ++ ++ * proc_service.h: Add ps_getpid prototype. ++ ++1999-11-03 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * 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 ++ ++ * thread_dbP.h: Include for strlen declaration. Remove ++ __libc_write prototype since this is already declared in ++ linuxthreads/internals.h. ++ ++1999-10-11 Ulrich Drepper ++ ++ * 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 ++ ++ * 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 instead. ++ * td_ta_new.c (td_ta_new): Likewise. ++ ++1999-10-08 Ulrich Drepper ++ ++ * shlib-versions: New file. ++ ++1999-10-07 Ulrich Drepper ++ ++ * 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 ++ ++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 , 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 , 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 , 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 , 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 ++ ++#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 , 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 , 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 ++ ++#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 , 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 ++#include ++ ++#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 , 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 ++ ++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 , 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 , 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 , 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 , 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 , 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 ++#include ++#include ++ ++#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 , 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 , 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 , 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 , 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 , 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 , 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 ++ ++#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 , 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 , 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 , 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 ++ ++#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 , 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 ++#include ++ ++#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 , 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 ++#include ++ ++#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 , 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 , 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 , 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 , 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 , 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 ++ ++#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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 ++#include ++#include ++#include ++ ++ ++/* 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 ++#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 + , 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 +-#include +- +-int +-add_em_up (int count,...) +-@{ +- va_list ap; +- int i, sum; +- +- va_start (ap, count); /* @r{Initialize the argument list.} */ +- +- sum = 0; +- for (i = 0; i < count; i++) +- sum += va_arg (ap, int); /* @r{Get the next argument value.} */ +- +- va_end (ap); /* @r{Clean up.} */ +- return sum; +-@} +- +-int +-main (void) +-@{ +- /* @r{This call prints 16.} */ +- printf ("%d\n", add_em_up (3, 5, 5, 6)); +- +- /* @r{This call prints 55.} */ +- printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); +- +- return 0; +-@} +diff -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 +- +-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 +- +-const char *argp_program_version = +- "argp-ex2 1.0"; +-const char *argp_program_bug_address = +- ""; +- +-/* @r{Program documentation.} */ +-static char doc[] = +- "Argp example #2 -- a pretty minimal program using argp"; +- +-/* @r{Our 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 +- +-const char *argp_program_version = +- "argp-ex3 1.0"; +-const char *argp_program_bug_address = +- ""; +- +-/* @r{Program documentation.} */ +-static char doc[] = +- "Argp example #3 -- a program with options and arguments using argp"; +- +-/* @r{A description of the arguments we accept.} */ +-static char args_doc[] = "ARG1 ARG2"; +- +-/* @r{The options we understand.} */ +-static struct argp_option options[] = @{ +- @{"verbose", 'v', 0, 0, "Produce verbose output" @}, +- @{"quiet", 'q', 0, 0, "Don't produce any output" @}, +- @{"silent", 's', 0, OPTION_ALIAS @}, +- @{"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" @}, +- @{ 0 @} +-@}; +- +-/* @r{Used by @code{main} to communicate with @code{parse_opt}.} */ +-struct arguments +-@{ +- char *args[2]; /* @r{@var{arg1} & @var{arg2}} */ +- int silent, verbose; +- char *output_file; +-@}; +- +-/* @r{Parse a single option.} */ +-static error_t +-parse_opt (int key, char *arg, struct argp_state *state) +-@{ +- /* @r{Get the @var{input} argument from @code{argp_parse}, which we +- know is a pointer to our arguments structure.} */ +- struct arguments *arguments = state->input; +- +- switch (key) +- @{ +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- +- case ARGP_KEY_ARG: +- if (state->arg_num >= 2) +- /* @r{Too many arguments.} */ +- argp_usage (state); +- +- arguments->args[state->arg_num] = arg; +- +- break; +- +- case ARGP_KEY_END: +- if (state->arg_num < 2) +- /* @r{Not enough arguments.} */ +- argp_usage (state); +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- @} +- return 0; +-@} +- +-/* @r{Our argp parser.} */ +-static struct argp argp = @{ options, parse_opt, args_doc, doc @}; +- +-int main (int argc, char **argv) +-@{ +- struct arguments arguments; +- +- /* @r{Default values.} */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- +- /* @r{Parse our arguments; every option seen by @code{parse_opt} will +- be reflected in @code{arguments}.} */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n" +- "VERBOSE = %s\nSILENT = %s\n", +- arguments.args[0], arguments.args[1], +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- +- exit (0); +-@} +diff -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 +-#include +-#include +- +-const char *argp_program_version = +- "argp-ex4 1.0"; +-const char *argp_program_bug_address = +- ""; +- +-/* @r{Program documentation.} */ +-static char doc[] = +- "Argp example #4 -- a program with somewhat more complicated\ +-options\ +-\vThis part of the documentation comes *after* the options;\ +- note that the text is automatically filled, but it's possible\ +- to force a line-break, e.g.\n<-- here."; +- +-/* @r{A description of the arguments we accept.} */ +-static char args_doc[] = "ARG1 [STRING...]"; +- +-/* @r{Keys for options without short-options.} */ +-#define OPT_ABORT 1 /* @r{--abort} */ +- +-/* @r{The options we understand.} */ +-static struct argp_option options[] = @{ +- @{"verbose", 'v', 0, 0, "Produce verbose output" @}, +- @{"quiet", 'q', 0, 0, "Don't produce any output" @}, +- @{"silent", 's', 0, OPTION_ALIAS @}, +- @{"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" @}, +- +- @{0,0,0,0, "The following options should be grouped together:" @}, +- @{"repeat", 'r', "COUNT", OPTION_ARG_OPTIONAL, +- "Repeat the output COUNT (default 10) times"@}, +- @{"abort", OPT_ABORT, 0, 0, "Abort before showing any output"@}, +- +- @{ 0 @} +-@}; +- +-/* @r{Used by @code{main} to communicate with @code{parse_opt}.} */ +-struct arguments +-@{ +- char *arg1; /* @r{@var{arg1}} */ +- char **strings; /* @r{[@var{string}@dots{}]} */ +- int silent, verbose, abort; /* @r{@samp{-s}, @samp{-v}, @samp{--abort}} */ +- char *output_file; /* @r{@var{file} arg to @samp{--output}} */ +- int repeat_count; /* @r{@var{count} arg to @samp{--repeat}} */ +-@}; +- +-/* @r{Parse a single option.} */ +-static error_t +-parse_opt (int key, char *arg, struct argp_state *state) +-@{ +- /* @r{Get the @code{input} argument from @code{argp_parse}, which we +- know is a pointer to our arguments structure.} */ +- struct arguments *arguments = state->input; +- +- switch (key) +- @{ +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- case 'r': +- arguments->repeat_count = arg ? atoi (arg) : 10; +- break; +- case OPT_ABORT: +- arguments->abort = 1; +- break; +- +- case ARGP_KEY_NO_ARGS: +- argp_usage (state); +- +- case ARGP_KEY_ARG: +- /* @r{Here we know that @code{state->arg_num == 0}, since we +- force argument parsing to end before any more arguments can +- get here.} */ +- arguments->arg1 = arg; +- +- /* @r{Now we consume all the rest of the arguments. +- @code{state->next} is the index in @code{state->argv} of the +- next argument to be parsed, which is the first @var{string} +- we're interested in, so we can just use +- @code{&state->argv[state->next]} as the value for +- arguments->strings. +- +- @emph{In addition}, by setting @code{state->next} to the end +- of the arguments, we can force argp to stop parsing here and +- return.} */ +- arguments->strings = &state->argv[state->next]; +- state->next = state->argc; +- +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- @} +- return 0; +-@} +- +-/* @r{Our argp parser.} */ +-static struct argp argp = @{ options, parse_opt, args_doc, doc @}; +- +-int main (int argc, char **argv) +-@{ +- int i, j; +- struct arguments arguments; +- +- /* @r{Default values.} */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- arguments.repeat_count = 1; +- arguments.abort = 0; +- +- /* @r{Parse our arguments; every option seen by @code{parse_opt} will be +- reflected in @code{arguments}.} */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- if (arguments.abort) +- error (10, 0, "ABORTED"); +- +- for (i = 0; i < arguments.repeat_count; i++) +- @{ +- printf ("ARG1 = %s\n", arguments.arg1); +- printf ("STRINGS = "); +- for (j = 0; arguments.strings[j]; j++) +- printf (j == 0 ? "%s" : ", %s", arguments.strings[j]); +- printf ("\n"); +- printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n", +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- @} +- +- exit (0); +-@} +diff -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 +-#include +- +-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 +-#include +-#include +-#include +-#include +- +-int +-main (void) +-@{ +- uid_t me; +- struct passwd *my_passwd; +- struct group *my_group; +- char **members; +- +- /* @r{Get information about the user ID.} */ +- me = getuid (); +- my_passwd = getpwuid (me); +- if (!my_passwd) +- @{ +- printf ("Couldn't find out about user %d.\n", (int) me); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Print the information.} */ +- printf ("I am %s.\n", my_passwd->pw_gecos); +- printf ("My login name is %s.\n", my_passwd->pw_name); +- printf ("My uid is %d.\n", (int) (my_passwd->pw_uid)); +- printf ("My home directory is %s.\n", my_passwd->pw_dir); +- printf ("My default shell is %s.\n", my_passwd->pw_shell); +- +- /* @r{Get information about the default group ID.} */ +- my_group = getgrgid (my_passwd->pw_gid); +- if (!my_group) +- @{ +- printf ("Couldn't find out about group %d.\n", +- (int) my_passwd->pw_gid); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Print the information.} */ +- printf ("My default group is %s (%d).\n", +- my_group->gr_name, (int) (my_passwd->pw_gid)); +- printf ("The members of this group are:\n"); +- members = my_group->gr_mem; +- while (*members) +- @{ +- printf (" %s\n", *(members)); +- members++; +- @} +- +- return EXIT_SUCCESS; +-@} +diff -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 +-#include +-#include +-#include +-@end group +- +-int +-main (void) +-@{ +- DIR *dp; +- struct dirent *ep; +- +- dp = opendir ("./"); +- if (dp != NULL) +- @{ +- while (ep = readdir (dp)) +- puts (ep->d_name); +- (void) closedir (dp); +- @} +- else +- 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 +-#include +-@end group +- +-static int +-one (struct dirent *unused) +-@{ +- return 1; +-@} +- +-int +-main (void) +-@{ +- struct dirent **eps; +- int n; +- +- n = scandir ("./", &eps, one, alphasort); +- if (n >= 0) +- @{ +- int cnt; +- for (cnt = 0; cnt < n; ++cnt) +- puts (eps[cnt]->d_name); +- @} +- else +- perror ("Couldn't open the directory"); +- +- return 0; +-@} +diff -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 +-#include +-#include +-#include +-#include +-#include +- +-#define SERVER "/tmp/serversocket" +-#define CLIENT "/tmp/mysocket" +-#define MAXMSG 512 +-#define MESSAGE "Yow!!! Are we having fun yet?!?" +- +-int +-main (void) +-@{ +- extern int make_named_socket (const char *name); +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* @r{Make the socket.} */ +- sock = make_named_socket (CLIENT); +- +- /* @r{Initialize the server socket address.} */ +- name.sun_family = AF_LOCAL; +- strcpy (name.sun_path, SERVER); +- size = strlen (name.sun_path) + sizeof (name.sun_family); +- +- /* @r{Send the datagram.} */ +- nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- @{ +- perror ("sendto (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Wait for a reply.} */ +- nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0); +- if (nbytes < 0) +- @{ +- perror ("recfrom (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Print a diagnostic message.} */ +- fprintf (stderr, "Client: got message: %s\n", message); +- +- /* @r{Clean up.} */ +- remove (CLIENT); +- close (sock); +-@} +diff -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 +-#include +-#include +-#include +-#include +- +-#define SERVER "/tmp/serversocket" +-#define MAXMSG 512 +- +-int +-main (void) +-@{ +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* @r{Remove the filename first, it's ok if the call fails} */ +- unlink (SERVER); +- +- /* @r{Make the socket, then loop endlessly.} */ +- sock = make_named_socket (SERVER); +- while (1) +- @{ +- /* @r{Wait for a datagram.} */ +- size = sizeof (name); +- nbytes = recvfrom (sock, message, MAXMSG, 0, +- (struct sockaddr *) & name, &size); +- if (nbytes < 0) +- @{ +- perror ("recfrom (server)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Give a diagnostic message.} */ +- fprintf (stderr, "Server: got message: %s\n", message); +- +- /* @r{Bounce the message back to the sender.} */ +- nbytes = sendto (sock, message, nbytes, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- @{ +- perror ("sendto (server)"); +- exit (EXIT_FAILURE); +- @} +- @} +-@} +diff -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 +- +-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 +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#define PORT 5555 +-#define MESSAGE "Yow!!! Are we having fun yet?!?" +-#define SERVERHOST "mescaline.gnu.org" +- +-void +-write_to_server (int filedes) +-@{ +- int nbytes; +- +- nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1); +- if (nbytes < 0) +- @{ +- perror ("write"); +- exit (EXIT_FAILURE); +- @} +-@} +- +- +-int +-main (void) +-@{ +- extern void init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port); +- int sock; +- struct sockaddr_in servername; +- +- /* @r{Create the socket.} */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- @{ +- perror ("socket (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Connect to the server.} */ +- init_sockaddr (&servername, SERVERHOST, PORT); +- if (0 > connect (sock, +- (struct sockaddr *) &servername, +- sizeof (servername))) +- @{ +- perror ("connect (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Send data to the server.} */ +- write_to_server (sock); +- close (sock); +- exit (EXIT_SUCCESS); +-@} +diff -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 +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#define PORT 5555 +-#define MAXMSG 512 +- +-int +-read_from_client (int filedes) +-@{ +- char buffer[MAXMSG]; +- int nbytes; +- +- nbytes = read (filedes, buffer, MAXMSG); +- if (nbytes < 0) +- @{ +- /* @r{Read error.} */ +- perror ("read"); +- exit (EXIT_FAILURE); +- @} +- else if (nbytes == 0) +- /* @r{End-of-file.} */ +- return -1; +- else +- @{ +- /* @r{Data read.} */ +- fprintf (stderr, "Server: got message: `%s'\n", buffer); +- return 0; +- @} +-@} +- +-int +-main (void) +-@{ +- extern int make_socket (uint16_t port); +- int sock; +- fd_set active_fd_set, read_fd_set; +- int i; +- struct sockaddr_in clientname; +- size_t size; +- +- /* @r{Create the socket and set it up to accept connections.} */ +- sock = make_socket (PORT); +- if (listen (sock, 1) < 0) +- @{ +- perror ("listen"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Initialize the set of active sockets.} */ +- FD_ZERO (&active_fd_set); +- FD_SET (sock, &active_fd_set); +- +- while (1) +- @{ +- /* @r{Block until input arrives on one or more active sockets.} */ +- read_fd_set = active_fd_set; +- if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) +- @{ +- perror ("select"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Service all the sockets with input pending.} */ +- for (i = 0; i < FD_SETSIZE; ++i) +- if (FD_ISSET (i, &read_fd_set)) +- @{ +- if (i == sock) +- @{ +- /* @r{Connection request on original socket.} */ +- int new; +- size = sizeof (clientname); +- new = accept (sock, +- (struct sockaddr *) &clientname, +- &size); +- if (new < 0) +- @{ +- perror ("accept"); +- exit (EXIT_FAILURE); +- @} +- fprintf (stderr, +- "Server: connect from host %s, port %hd.\n", +- inet_ntoa (clientname.sin_addr), +- ntohs (clientname.sin_port)); +- FD_SET (new, &active_fd_set); +- @} +- else +- @{ +- /* @r{Data arriving on an already-connected socket.} */ +- if (read_from_client (i) < 0) +- @{ +- close (i); +- FD_CLR (i, &active_fd_set); +- @} +- @} +- @} +- @} +-@} +diff -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 +-#include +-#include +-#include +-#include +- +-void +-init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port) +-@{ +- struct hostent *hostinfo; +- +- name->sin_family = AF_INET; +- name->sin_port = htons (port); +- hostinfo = gethostbyname (hostname); +- if (hostinfo == NULL) +- @{ +- fprintf (stderr, "Unknown host %s.\n", hostname); +- exit (EXIT_FAILURE); +- @} +- name->sin_addr = *(struct in_addr *) hostinfo->h_addr; +-@} +diff -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 +- #include +- #include +- #include +- +- void +- with_other_locale (char *new_locale, +- void (*subroutine) (int), +- int argument) +- { +- char *old_locale, *saved_locale; +- +- /* Get the name of the current locale. */ +- old_locale = setlocale (LC_ALL, NULL); +- +- /* Copy the name so it won't be clobbered by `setlocale'. */ +- saved_locale = strdup (old_locale); +- if (saved_locale == NULL) +- fatal ("Out of memory"); +- +- /* Now change the locale and do some stuff with it. */ +- setlocale (LC_ALL, new_locale); +- (*subroutine) (argument); +- +- /* Restore the original locale. */ +- setlocale (LC_ALL, saved_locale); +- free (saved_locale); +- } +- +- *Portability Note:* Some ISO C systems may define additional locale +-categories and future versions of the library will do so. For +-portability, assume that any symbol beginning with `LC_' might be +-defined in `locale.h'. +- +- +-File: libc.info, Node: Standard Locales, Next: Locale Information, Prev: Setting the Locale, Up: Locales +- +-Standard Locales +-================ +- +- The only locale names you can count on finding on all operating +-systems are these three standard ones: +- +-`"C"' +- This is the standard C locale. The attributes and behavior it +- provides are specified in the ISO C standard. When your program +- starts up, it initially uses this locale by default. +- +-`"POSIX"' +- This is the standard POSIX locale. Currently, it is an alias for +- the standard C locale. +- +-`""' +- The empty name says to select a locale based on environment +- variables. *Note Locale Categories::. +- +- Defining and installing named locales is normally a responsibility of +-the system administrator at your site (or the person who installed the +-GNU C library). It is also possible for the user to create private +-locales. All this will be discussed later when describing the tool to +-do so 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 +- int +- main (void) +- { +- printf ("Hello, world!\n"); +- return 0; +- } +- +- Now we want to internationalize the message and therefore replace the +-message with whatever the user wants. +- +- #include +- #include +- #include "msgnrs.h" +- int +- main (void) +- { +- nl_catd catdesc = catopen ("hello.cat", NL_CAT_LOCALE); +- printf (catgets (catdesc, SetMainSet, SetMainHello, +- "Hello, world!\n")); +- catclose (catdesc); +- return 0; +- } +- +- We see how the catalog object is opened and the returned descriptor +-used in the other function calls. It is not really necessary to check +-for failure of any of the functions since even in these situations the +-functions will behave reasonable. They simply will be return a +-translation. +- +- What remains unspecified here are the constants `SetMainSet' and +-`SetMainHello'. These are the symbolic names describing the message. +-To get the actual definitions which match the information in the +-catalog file we have to create the message catalog source file and +-process it using the `gencat' program. +- +- $ Messages for the famous greeting program. +- $quote " +- +- $set Main +- Hello "Hallo, Welt!\n" +- +- Now we can start building the program (assume the message catalog +-source file is named `hello.msg' and the program source file `hello.c'): +- +- % gencat -H msgnrs.h -o hello.cat hello.msg +- % cat msgnrs.h +- #define MainSet 0x1 /* hello.msg:4 */ +- #define MainHello 0x1 /* hello.msg:5 */ +- % gcc -o hello hello.c -I. +- % cp hello.cat /usr/share/locale/de/LC_MESSAGES +- % echo $LC_ALL +- de +- % ./hello +- Hallo, Welt! +- % +- +- The call of the `gencat' program creates the missing header file +-`msgnrs.h' as well as the message catalog binary. The former is used +-in the compilation of `hello.c' while the later is placed in a +-directory in which the `catopen' function will try to locate it. +-Please check the `LC_ALL' environment variable and the default path for +-`catopen' presented in the description above. +- +- +-File: libc.info, Node: The Uniforum approach, Prev: Message catalogs a la X/Open, Up: Message Translation +- +-The Uniforum approach to Message Translation +-============================================ +- +- Sun Microsystems tried to standardize a different approach to message +-translation in the Uniforum group. There never was a real standard +-defined but still the interface was used in Sun's operation systems. +-Since this approach fits better in the development process of free +-software it is also used throughout the GNU 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 +- #include +- #include +- +- /* Define an array of critters to sort. */ +- +- struct critter +- { +- const char *name; +- const char *species; +- }; +- +- struct critter muppets[] = +- { +- {"Kermit", "frog"}, +- {"Piggy", "pig"}, +- {"Gonzo", "whatever"}, +- {"Fozzie", "bear"}, +- {"Sam", "eagle"}, +- {"Robin", "frog"}, +- {"Animal", "animal"}, +- {"Camilla", "chicken"}, +- {"Sweetums", "monster"}, +- {"Dr. Strangepork", "pig"}, +- {"Link Hogthrob", "pig"}, +- {"Zoot", "human"}, +- {"Dr. Bunsen Honeydew", "human"}, +- {"Beaker", "human"}, +- {"Swedish Chef", "human"} +- }; +- +- int count = sizeof (muppets) / sizeof (struct critter); +- +- +- +- /* This is the comparison function used for sorting and searching. */ +- +- int +- critter_cmp (const struct critter *c1, const struct critter *c2) +- { +- return strcmp (c1->name, c2->name); +- } +- +- +- /* Print information about a critter. */ +- +- void +- print_critter (const struct critter *c) +- { +- printf ("%s, the %s\n", c->name, c->species); +- } +- /* Do the lookup into the sorted array. */ +- +- void +- find_critter (const char *name) +- { +- struct critter target, *result; +- target.name = name; +- result = bsearch (&target, muppets, count, sizeof (struct critter), +- critter_cmp); +- if (result) +- print_critter (result); +- else +- printf ("Couldn't find %s.\n", name); +- } +- +- /* Main program. */ +- +- int +- main (void) +- { +- int i; +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- qsort (muppets, count, sizeof (struct critter), critter_cmp); +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- find_critter ("Kermit"); +- find_critter ("Gonzo"); +- find_critter ("Janice"); +- +- return 0; +- } +- +- The output from this program looks like: +- +- Kermit, the frog +- Piggy, the pig +- Gonzo, the whatever +- Fozzie, the bear +- Sam, the eagle +- Robin, the frog +- Animal, the animal +- Camilla, the chicken +- Sweetums, the monster +- Dr. Strangepork, the pig +- Link Hogthrob, the pig +- Zoot, the human +- Dr. Bunsen Honeydew, the human +- Beaker, the human +- Swedish Chef, the human +- +- Animal, the animal +- Beaker, the human +- Camilla, the chicken +- Dr. Bunsen Honeydew, the human +- Dr. Strangepork, the pig +- Fozzie, the bear +- Gonzo, the whatever +- Kermit, the frog +- Link Hogthrob, the pig +- Piggy, the pig +- Robin, the frog +- Sam, the eagle +- Swedish Chef, the human +- Sweetums, the monster +- Zoot, the human +- +- Kermit, the frog +- Gonzo, the whatever +- Couldn't find Janice. +- +- +-File: libc.info, Node: Hash Search Function, Next: Tree Search Function, Prev: Search/Sort Example, Up: Searching and Sorting +- +-The `hsearch' function. +-======================= +- +- The functions mentioned so far in this chapter are searching in a +-sorted or unsorted array. There are other methods to organize +-information which later should be searched. The costs of insert, +-delete and search differ. One possible implementation is using hashing +-tables. +- +- - 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 +- #include +- +- void +- skip_whitespace (FILE *stream) +- { +- int c; +- do +- /* No need to check for `EOF' because it is not +- `isspace', and `ungetc' ignores `EOF'. */ +- c = getc (stream); +- while (isspace (c)); +- ungetc (c, stream); +- } +- +- +-File: libc.info, Node: Block Input/Output, Next: Formatted Output, Prev: Unreading, Up: I/O on Streams +- +-Block Input/Output +-================== +- +- This section describes how to do input and output operations on +-blocks of data. You can use these functions to read and write binary +-data, as well as to read and write text in fixed-size blocks instead of +-by characters or lines. +- +- Binary files are typically used to read and write blocks of data in +-the same format as is used to represent the data in a running program. +-In other words, arbitrary blocks of memory--not just character or string +-objects--can be written to a binary file, and meaningfully read in +-again by the same program. +- +- Storing data in binary form is often considerably more efficient than +-using the formatted I/O functions. Also, for floating-point numbers, +-the binary form avoids possible loss of precision in the conversion +-process. On the other hand, binary files can't be examined or modified +-easily using many standard file utilities (such as text editors), and +-are not portable between different implementations of the language, or +-different kinds of computers. +- +- These functions are declared in `stdio.h'. +- +- - Function: size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE +- *STREAM) +- This function reads up to COUNT objects of size SIZE into the +- array DATA, from the stream STREAM. It returns the number of +- objects actually read, which might be less than COUNT if a read +- error occurs or the end of the file is reached. This function +- returns a value of zero (and doesn't read anything) if either SIZE +- or COUNT is zero. +- +- If `fread' encounters end of file in the middle of an object, it +- returns the number of complete objects read, and discards the +- partial object. Therefore, the stream remains at the actual end +- of the file. +- +- - Function: size_t 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 +- #include +- +- void +- eprintf (const char *template, ...) +- { +- va_list ap; +- extern char *program_invocation_short_name; +- +- fprintf (stderr, "%s: ", program_invocation_short_name); +- va_start (ap, template); +- vfprintf (stderr, template, ap); +- va_end (ap); +- } +- +-You could call `eprintf' like this: +- +- eprintf ("file `%s' does not exist\n", filename); +- +- In GNU C, there is a special construct you can use to let the +-compiler know that a function uses a `printf'-style format string. +-Then it can check the number and types of arguments in each call to the +-function, and warn you when they do not match the format string. For +-example, take this declaration of `eprintf': +- +- void eprintf (const char *template, ...) +- __attribute__ ((format (printf, 1, 2))); +- +-This tells the compiler that `eprintf' uses a format string like +-`printf' (as opposed to `scanf'; *note Formatted Input::.); the format +-string appears as the first argument; and the arguments to satisfy the +-format begin with the second. *Note Declaring Attributes of Functions: +-(gcc.info)Function Attributes, for more information. +- +- +-File: libc.info, Node: Parsing a Template String, Next: Example of Parsing, Prev: Variable Arguments Output, Up: Formatted Output +- +-Parsing a Template String +-------------------------- +- +- You can use the function `parse_printf_format' to obtain information +-about the number and types of arguments that are expected by a given +-template string. This function permits interpreters that provide +-interfaces to `printf' to avoid passing along invalid arguments from +-the user's program, which could cause a crash. +- +- All the symbols described in this section are declared in the header +-file `printf.h'. +- +- - Function: size_t parse_printf_format (const char *TEMPLATE, size_t +- N, int *ARGTYPES) +- This function returns information about the number and types of +- arguments expected by the `printf' template string TEMPLATE. The +- information is stored in the array ARGTYPES; each element of this +- array describes one argument. This information is encoded using +- the various `PA_' macros, listed below. +- +- The 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 +- #include +- #include +- typedef struct +- { +- char *name; +- } +- Widget; +- +- int +- print_widget (FILE *stream, +- const struct printf_info *info, +- const void *const *args) +- { +- const Widget *w; +- char *buffer; +- int len; +- +- /* Format the output into a string. */ +- w = *((const Widget **) (args[0])); +- len = asprintf (&buffer, "", w, w->name); +- if (len == -1) +- return -1; +- +- /* Pad to the minimum field width and print to the stream. */ +- len = fprintf (stream, "%*s", +- (info->left ? -info->width : info->width), +- buffer); +- +- /* Clean up and return. */ +- free (buffer); +- return len; +- } +- +- +- int +- print_widget_arginfo (const struct printf_info *info, size_t n, +- int *argtypes) +- { +- /* We always take exactly one argument and this is a pointer to the +- structure.. */ +- if (n > 0) +- argtypes[0] = PA_POINTER; +- return 1; +- } +- +- +- int +- main (void) +- { +- /* Make a widget to print. */ +- Widget mywidget; +- mywidget.name = "mywidget"; +- +- /* Register the print function for widgets. */ +- register_printf_function ('W', print_widget, print_widget_arginfo); +- +- /* Now print the widget. */ +- printf ("|%W|\n", &mywidget); +- printf ("|%35W|\n", &mywidget); +- printf ("|%-35W|\n", &mywidget); +- +- return 0; +- } +- +- The output produced by this program looks like: +- +- || +- | | +- | | +- +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 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 +- +- static char buffer[] = "foobar"; +- +- int +- main (void) +- { +- int ch; +- FILE *stream; +- +- stream = fmemopen (buffer, strlen (buffer), "r"); +- while ((ch = fgetc (stream)) != EOF) +- printf ("Got %c\n", ch); +- fclose (stream); +- +- return 0; +- } +- +- This program produces the following output: +- +- Got f +- Got o +- Got o +- Got b +- Got a +- Got r +- +- - Function: FILE * open_memstream (char **PTR, size_t *SIZELOC) +- This function opens a stream for writing to a buffer. The buffer +- is allocated dynamically (as with `malloc'; *note Unconstrained +- Allocation::.) and grown as necessary. +- +- When the stream is closed with `fclose' or flushed with `fflush', +- the locations PTR and SIZELOC are updated to contain the pointer +- to the buffer and its size. The values thus stored remain valid +- only as long as no further output on the stream takes place. If +- you do more output, you must flush the stream again to store new +- values before you use them again. +- +- A null character is written at the end of the buffer. This null +- character is *not* included in the size value stored at SIZELOC. +- +- You can move the stream's file position with `fseek' or `fseeko' +- (*note File Positioning::.). Moving the file position past the +- end of the data already written fills the intervening space with +- zeroes. +- +- Here is an example of using `open_memstream': +- +- #include +- +- int +- main (void) +- { +- char *bp; +- size_t size; +- FILE *stream; +- +- stream = open_memstream (&bp, &size); +- fprintf (stream, "hello"); +- fflush (stream); +- printf ("buf = `%s', size = %d\n", bp, size); +- fprintf (stream, ", world"); +- fclose (stream); +- printf ("buf = `%s', size = %d\n", bp, size); +- +- return 0; +- } +- +- This program produces the following output: +- +- buf = `hello', size = 5 +- buf = `hello, world', size = 12 +- +- +-File: libc.info, Node: Obstack Streams, Next: Custom Streams, Prev: String Streams, Up: Other Kinds of Streams +- +-Obstack Streams +---------------- +- +- You can open an output stream that puts it data in an obstack. +-*Note Obstacks::. +- +- - Function: FILE * open_obstack_stream (struct obstack *OBSTACK) +- This function opens a stream for writing data into the obstack +- OBSTACK. This starts an object in the obstack and makes it grow +- as data is written (*note Growing Objects::.). +- +- Calling `fflush' on this stream updates the current size of the +- object to match the amount of data that has been written. After a +- call to `fflush', you can examine the object temporarily. +- +- You can move the file position of an obstack stream with `fseek' or +- `fseeko' (*note File Positioning::.). Moving the file position +- past the end of the data written fills the intervening space with +- zeros. +- +- To make the object permanent, update the obstack with `fflush', and +- then use `obstack_finish' to finalize the object and get its +- address. The following write to the stream starts a new object in +- the obstack, and later writes add to that object until you do +- another `fflush' and `obstack_finish'. +- +- But how do you find out how long the object is? You can get the +- length in bytes by calling `obstack_object_size' (*note Status of +- an Obstack::.), or you can null-terminate the object like this: +- +- obstack_1grow (OBSTACK, 0); +- +- Whichever one you do, you must do it *before* calling +- `obstack_finish'. (You can do both if you wish.) +- +- Here is a sample function that uses `open_obstack_stream': +- +- char * +- make_message_string (const char *a, int b) +- { +- FILE *stream = open_obstack_stream (&message_obstack); +- output_task (stream); +- fprintf (stream, ": "); +- fprintf (stream, a, b); +- fprintf (stream, "\n"); +- fclose (stream); +- obstack_1grow (&message_obstack, 0); +- return obstack_finish (&message_obstack); +- } +- +- +-File: libc.info, Node: Custom Streams, Prev: Obstack Streams, Up: Other Kinds of Streams +- +-Programming Your Own Custom Streams +------------------------------------ +- +- This section describes how you can make a stream that gets input +-from an arbitrary data source or writes output to an arbitrary data sink +-programmed by you. We call these "custom streams". +- +-* 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 +- +- 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 +- #include +- #include +- #include +- +- int +- input_timeout (int filedes, unsigned int seconds) +- { +- fd_set set; +- struct timeval timeout; +- +- /* Initialize the file descriptor set. */ +- FD_ZERO (&set); +- FD_SET (filedes, &set); +- +- /* Initialize the timeout data structure. */ +- timeout.tv_sec = seconds; +- timeout.tv_usec = 0; +- /* `select' returns 0 if timeout, 1 if input available, -1 if error. */ +- return TEMP_FAILURE_RETRY (select (FD_SETSIZE, +- &set, NULL, NULL, +- &timeout)); +- } +- +- int +- main (void) +- { +- fprintf (stderr, "select returned %d.\n", +- input_timeout (STDIN_FILENO, 5)); +- return 0; +- } +- +- There is another example showing the use of `select' to multiplex +-input from multiple sockets in *Note Server Example::. +- +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 +- +-is typically used to include a header file `file.h' that contains +-definitions and declarations for a standard library. This file would +-normally be installed in a standard place by your system administrator. +-You should use this second form for the C library header files. +- +- Typically, `#include' directives are placed at the top of the C +-source file, before any other code. If you begin your source files with +-some comments explaining what the code in the file does (a good idea), +-put the `#include' directives immediately afterwards, following the +-feature test macro definition (*note Feature Test Macros::.). +- +- For more information about the use of header files and `#include' +-directives, *note Header Files: (cpp.info)Header Files.. +- +- The GNU C library provides several header files, each of which +-contains the type and macro definitions and variable and function +-declarations for a group of related facilities. This means that your +-programs may need to include several header files, depending on exactly +-which facilities you are using. +- +- Some library header files include other library header files +-automatically. However, as a matter of programming style, you should +-not rely on this; it is better to explicitly include all the header +-files required for the library facilities you are using. The GNU C +-library header files have been written in such a way that it doesn't +-matter if a header file is accidentally included more than once; +-including a header file a second time has no effect. Likewise, if your +-program needs to include multiple header files, the order in which they +-are included doesn't matter. +- +- *Compatibility Note:* Inclusion of standard header files in any +-order and any number of times works in any ISO C implementation. +-However, this has traditionally not been the case in many older C +-implementations. +- +- Strictly speaking, you don't *have to* include a header file to use +-a function it declares; you could declare the function explicitly +-yourself, according to the specifications in this manual. But it is +-usually better to include the header file because it may define types +-and macros that are not otherwise available and because it may define +-more efficient macro replacements for some functions. It is also a sure +-way to have the correct declaration. +- +- +-File: libc.info, Node: Macro Definitions, Next: Reserved Names, Prev: Header Files, Up: Using the Library +- +-Macro Definitions of Functions +------------------------------- +- +- If we describe something as a function in this manual, it may have a +-macro definition as well. This normally has no effect on how your +-program runs--the macro definition does the same thing as the function +-would. In particular, macro equivalents for library functions evaluate +-arguments exactly once, in the same way that a function call would. The +-main reason for these macro definitions is that sometimes they can +-produce an inline expansion that is considerably faster than an actual +-function call. +- +- Taking the address of a library function works even if it is also +-defined as a macro. This is because, in this context, the name of the +-function isn't followed by the left parenthesis that is syntactically +-necessary to recognize a macro call. +- +- You might occasionally want to avoid using the macro definition of a +-function--perhaps to make your program easier to debug. There are two +-ways you can do this: +- +- * You can avoid a macro definition in a specific use by enclosing +- the name of the function in parentheses. This works because the +- name of the function doesn't appear in a syntactic context where +- it is recognizable as a macro call. +- +- * You can suppress any macro definition for a whole source file by +- using the `#undef' preprocessor directive, unless otherwise stated +- explicitly in the description of that facility. +- +- For example, suppose the header file `stdlib.h' declares a function +-named `abs' with +- +- extern int abs (int); +- +-and also provides a macro definition for `abs'. Then, in: +- +- #include +- int f (int *i) { return abs (++*i); } +- +-the reference to `abs' might refer to either a macro or a function. On +-the other hand, in each of the following examples the reference is to a +-function and not a macro. +- +- #include +- int g (int *i) { return (abs) (++*i); } +- +- #undef abs +- int h (int *i) { return abs (++*i); } +- +- Since macro definitions that double for a function behave in exactly +-the same way as the actual function version, there is usually no need +-for any of these methods. In fact, removing macro definitions usually +-just makes your program slower. +- +- +-File: libc.info, Node: Reserved Names, Next: Feature Test Macros, Prev: Macro Definitions, Up: Using the Library +- +-Reserved Names +--------------- +- +- The names of all library types, macros, variables and functions that +-come from the ISO C standard are reserved unconditionally; your program +-*may not* redefine these names. All other library names are reserved +-if your program explicitly includes the header file that defines or +-declares them. There are several reasons for these restrictions: +- +- * Other people reading your code could get very confused if you were +- using a function named `exit' to do something completely different +- from what the standard `exit' function does, for example. +- Preventing this situation helps to make your programs easier to +- understand and contributes to modularity and maintainability. +- +- * It avoids the possibility of a user accidentally redefining a +- library function that is called by other library functions. If +- redefinition were allowed, those other functions would not work +- properly. +- +- * It allows the compiler to do whatever special optimizations it +- pleases on calls to these functions, without the possibility that +- they may have been redefined by the user. Some library +- facilities, such as those for dealing with variadic arguments +- (*note Variadic Functions::.) and non-local exits (*note +- Non-Local Exits::.), actually require a considerable amount of +- cooperation on the part of the C compiler, and 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 +- #include +- #include +- #include +- +- int +- main (void) +- { +- DIR *dp; +- struct dirent *ep; +- +- dp = opendir ("./"); +- if (dp != NULL) +- { +- while (ep = readdir (dp)) +- puts (ep->d_name); +- (void) closedir (dp); +- } +- else +- 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 +- #include +- +- static int +- one (struct dirent *unused) +- { +- return 1; +- } +- +- int +- main (void) +- { +- struct dirent **eps; +- int n; +- +- n = scandir ("./", &eps, one, alphasort); +- if (n >= 0) +- { +- int cnt; +- for (cnt = 0; cnt < n; ++cnt) +- puts (eps[cnt]->d_name); +- } +- else +- perror ("Couldn't open the directory"); +- +- return 0; +- } +- +- 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 +- #include +- #include +- #include +- +- /* Read characters from the pipe and echo them to `stdout'. */ +- +- void +- read_from_pipe (int file) +- { +- FILE *stream; +- int c; +- stream = fdopen (file, "r"); +- while ((c = fgetc (stream)) != EOF) +- putchar (c); +- fclose (stream); +- } +- +- /* Write some random text to the pipe. */ +- +- void +- write_to_pipe (int file) +- { +- FILE *stream; +- stream = fdopen (file, "w"); +- fprintf (stream, "hello, world!\n"); +- fprintf (stream, "goodbye, world!\n"); +- fclose (stream); +- } +- +- int +- main (void) +- { +- pid_t pid; +- int mypipe[2]; +- /* Create the pipe. */ +- if (pipe (mypipe)) +- { +- fprintf (stderr, "Pipe failed.\n"); +- return EXIT_FAILURE; +- } +- +- /* Create the child process. */ +- pid = fork (); +- if (pid == (pid_t) 0) +- { +- /* This is the child process. */ +- 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 +- #include +- +- void +- write_data (FILE * stream) +- { +- int i; +- for (i = 0; i < 100; i++) +- fprintf (stream, "%d\n", i); +- if (ferror (stream)) +- { +- fprintf (stderr, "Output to stream failed.\n"); +- exit (EXIT_FAILURE); +- } +- } +- int +- main (void) +- { +- FILE *output; +- +- output = popen ("more", "w"); +- if (!output) +- { +- fprintf (stderr, "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 +- #include +- #include +- #include +- #include +- #include +- +- int +- make_named_socket (const char *filename) +- { +- struct sockaddr_un name; +- int sock; +- size_t size; +- +- /* Create the socket. */ +- sock = socket (PF_LOCAL, SOCK_DGRAM, 0); +- if (sock < 0) +- { +- perror ("socket"); +- exit (EXIT_FAILURE); +- } +- +- /* Bind a name to the socket. */ +- name.sun_family = AF_LOCAL; +- strncpy (name.sun_path, filename, sizeof (name.sun_path)); +- +- /* 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 +- #include +- #include +- #include +- +- int +- make_socket (uint16_t port) +- { +- int sock; +- struct sockaddr_in name; +- +- /* Create the socket. */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- { +- perror ("socket"); +- exit (EXIT_FAILURE); +- } +- +- /* Give the socket a name. */ +- name.sin_family = AF_INET; +- name.sin_port = htons (port); +- name.sin_addr.s_addr = htonl (INADDR_ANY); +- if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) +- { +- perror ("bind"); +- exit (EXIT_FAILURE); +- } +- +- return sock; +- } +- +- Here is another example, showing how you can fill in a `sockaddr_in' +-structure, given a host name string and a port number: +- +- #include +- #include +- #include +- #include +- #include +- +- void +- init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port) +- { +- struct hostent *hostinfo; +- +- name->sin_family = AF_INET; +- name->sin_port = htons (port); +- hostinfo = gethostbyname (hostname); +- if (hostinfo == NULL) +- { +- fprintf (stderr, "Unknown host %s.\n", hostname); +- exit (EXIT_FAILURE); +- } +- name->sin_addr = *(struct in_addr *) hostinfo->h_addr; +- } +- +- +-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 +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- +- #define PORT 5555 +- #define MESSAGE "Yow!!! Are we having fun yet?!?" +- #define SERVERHOST "mescaline.gnu.org" +- +- void +- write_to_server (int filedes) +- { +- int nbytes; +- +- nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1); +- if (nbytes < 0) +- { +- perror ("write"); +- exit (EXIT_FAILURE); +- } +- } +- +- +- int +- main (void) +- { +- extern void init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port); +- int sock; +- struct sockaddr_in servername; +- +- /* Create the socket. */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- { +- perror ("socket (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Connect to the server. */ +- init_sockaddr (&servername, SERVERHOST, PORT); +- if (0 > connect (sock, +- (struct sockaddr *) &servername, +- sizeof (servername))) +- { +- perror ("connect (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Send data to the server. */ +- write_to_server (sock); +- close (sock); +- exit (EXIT_SUCCESS); +- } +- +- +-File: libc.info, Node: Server Example, Next: Out-of-Band Data, Prev: Byte Stream Example, Up: Connections +- +-Byte Stream Connection Server Example +-------------------------------------- +- +- The server end is much more complicated. Since we want to allow +-multiple clients to be connected to the server at the same time, it +-would be incorrect to wait for input from a single client by simply +-calling `read' or `recv'. Instead, the right thing to do is to use +-`select' (*note Waiting for I/O::.) to wait for input on all of the +-open sockets. This also allows the server to deal with additional +-connection requests. +- +- This particular server doesn't do anything interesting once it has +-gotten a message from a client. It does close the socket for that +-client when it detects an end-of-file condition (resulting from the +-client shutting down its end of the connection). +- +- This program uses `make_socket' to set up the socket address; see +-*Note Inet Example::. +- +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- +- #define PORT 5555 +- #define MAXMSG 512 +- +- int +- read_from_client (int filedes) +- { +- char buffer[MAXMSG]; +- int nbytes; +- +- nbytes = read (filedes, buffer, MAXMSG); +- if (nbytes < 0) +- { +- /* Read error. */ +- perror ("read"); +- exit (EXIT_FAILURE); +- } +- else if (nbytes == 0) +- /* End-of-file. */ +- return -1; +- else +- { +- /* Data read. */ +- fprintf (stderr, "Server: got message: `%s'\n", buffer); +- return 0; +- } +- } +- +- int +- main (void) +- { +- extern int make_socket (uint16_t port); +- int sock; +- fd_set active_fd_set, read_fd_set; +- int i; +- struct sockaddr_in clientname; +- size_t size; +- +- /* Create the socket and set it up to accept connections. */ +- sock = make_socket (PORT); +- if (listen (sock, 1) < 0) +- { +- perror ("listen"); +- exit (EXIT_FAILURE); +- } +- +- /* Initialize the set of active sockets. */ +- FD_ZERO (&active_fd_set); +- FD_SET (sock, &active_fd_set); +- +- while (1) +- { +- /* Block until input arrives on one or more active sockets. */ +- read_fd_set = active_fd_set; +- if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) +- { +- perror ("select"); +- exit (EXIT_FAILURE); +- } +- +- /* Service all the sockets with input pending. */ +- for (i = 0; i < FD_SETSIZE; ++i) +- if (FD_ISSET (i, &read_fd_set)) +- { +- if (i == sock) +- { +- /* Connection request on original socket. */ +- int new; +- size = sizeof (clientname); +- new = accept (sock, +- (struct sockaddr *) &clientname, +- &size); +- if (new < 0) +- { +- perror ("accept"); +- exit (EXIT_FAILURE); +- } +- fprintf (stderr, +- "Server: connect from host %s, port %hd.\n", +- inet_ntoa (clientname.sin_addr), +- ntohs (clientname.sin_port)); +- FD_SET (new, &active_fd_set); +- } +- else +- { +- /* Data arriving on an already-connected socket. */ +- if (read_from_client (i) < 0) +- { +- close (i); +- FD_CLR (i, &active_fd_set); +- } +- } +- } +- } +- } +- +- +-File: libc.info, Node: Out-of-Band Data, Prev: Server Example, Up: Connections +- +-Out-of-Band Data +----------------- +- +- Streams with connections permit "out-of-band" data that is delivered +-with higher priority than ordinary data. Typically the reason for +-sending out-of-band data is to send notice of an exceptional condition. +-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 +- #include +- #include +- #include +- #include +- +- #define SERVER "/tmp/serversocket" +- #define MAXMSG 512 +- +- int +- main (void) +- { +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* Remove the filename first, it's ok if the call fails */ +- unlink (SERVER); +- +- /* Make the socket, then loop endlessly. */ +- sock = make_named_socket (SERVER); +- while (1) +- { +- /* Wait for a datagram. */ +- size = sizeof (name); +- nbytes = recvfrom (sock, message, MAXMSG, 0, +- (struct sockaddr *) & name, &size); +- if (nbytes < 0) +- { +- perror ("recfrom (server)"); +- exit (EXIT_FAILURE); +- } +- +- /* Give a diagnostic message. */ +- fprintf (stderr, "Server: got message: %s\n", message); +- +- /* Bounce the message back to the sender. */ +- nbytes = sendto (sock, message, nbytes, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- { +- perror ("sendto (server)"); +- exit (EXIT_FAILURE); +- } +- } +- } +- +- +-File: libc.info, Node: Example Receiver, Prev: Datagram Example, Up: Datagrams +- +-Example of Reading Datagrams +----------------------------- +- +- Here is the client program corresponding to the server above. +- +- It sends a datagram to the server and then waits for a reply. Notice +-that the socket for the client (as well as for the server) in this +-example has to be given a name. This is so that the server can direct +-a message back to the client. Since the socket has no associated +-connection state, the only way the server can do this is by referencing +-the name of the client. +- +- #include +- #include +- #include +- #include +- #include +- #include +- +- #define SERVER "/tmp/serversocket" +- #define CLIENT "/tmp/mysocket" +- #define MAXMSG 512 +- #define MESSAGE "Yow!!! Are we having fun yet?!?" +- +- int +- main (void) +- { +- extern int make_named_socket (const char *name); +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* Make the socket. */ +- sock = make_named_socket (CLIENT); +- +- /* Initialize the server socket address. */ +- name.sun_family = AF_LOCAL; +- strcpy (name.sun_path, SERVER); +- size = strlen (name.sun_path) + sizeof (name.sun_family); +- +- /* Send the datagram. */ +- nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- { +- perror ("sendto (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Wait for a reply. */ +- nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0); +- if (nbytes < 0) +- { +- perror ("recfrom (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Print a diagnostic message. */ +- fprintf (stderr, "Client: got message: %s\n", message); +- +- /* Clean up. */ +- remove (CLIENT); +- close (sock); +- } +- +- Keep in mind that datagram socket communications are unreliable. In +-this example, the client program waits indefinitely if the message +-never reaches the server or if the server's response never comes back. +-It's up to the user running the program to kill 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 and characters. +- +- All of these flags are bits in the `c_iflag' member of the `struct +-termios' structure. The member is an integer, and you change flags +-using the operators `&', `|' and `^'. Don't try to specify the entire +-value for `c_iflag'--instead, change only specific flags and leave the +-rest untouched (*note Setting Modes::.). +- +- - Macro: tcflag_t INPCK +- If this bit is set, input parity checking is enabled. If it is +- not set, no checking at all is done for parity errors on input; the +- characters are simply passed through to the application. +- +- Parity checking on input processing is independent of whether +- parity detection and generation on the underlying terminal +- hardware is enabled; see *Note Control Modes::. For example, you +- could clear the `INPCK' input mode flag and set the `PARENB' +- control mode flag to ignore parity errors on input, but still +- generate parity on output. +- +- If this bit is set, what happens when a parity error is detected +- depends on whether the `IGNPAR' or `PARMRK' bits are set. If +- neither of these bits are set, a byte with a parity error is +- passed to the application as a `'\0'' character. +- +- - Macro: tcflag_t IGNPAR +- If this bit is set, any byte with a framing or parity error is +- ignored. This is only useful if `INPCK' is also set. +- +- - Macro: tcflag_t PARMRK +- If this bit is set, input bytes with parity or framing errors are +- marked when passed to the program. This bit is meaningful only +- when `INPCK' is set and `IGNPAR' is not set. +- +- The way erroneous bytes are marked is with two preceding bytes, +- `377' and `0'. Thus, the program actually reads three bytes for +- one erroneous byte received from the terminal. +- +- If a valid byte has the value `0377', and `ISTRIP' (see below) is +- not set, the program might confuse it with the prefix that marks a +- parity error. So a valid byte `0377' is passed to the program as +- two bytes, `0377' `0377', in this case. +- +- - Macro: tcflag_t ISTRIP +- If this bit is set, valid input bytes are stripped to seven bits; +- otherwise, all eight bits are available for programs to read. +- +- - Macro: tcflag_t IGNBRK +- If this bit is set, break conditions are ignored. +- +- A "break condition" is defined in the context of asynchronous +- serial data transmission as a series of zero-value bits longer +- than a single byte. +- +- - Macro: tcflag_t BRKINT +- If this bit is set and `IGNBRK' is not set, a break condition +- clears the terminal input and output queues and raises a `SIGINT' +- signal for the foreground process group associated with the +- terminal. +- +- If neither `BRKINT' nor `IGNBRK' are set, a break condition is +- passed to the application as a single `'\0'' character if `PARMRK' +- is not set, or otherwise as a three-character sequence `'\377'', +- `'\0'', `'\0''. +- +- - Macro: tcflag_t IGNCR +- If this bit is set, carriage return characters (`'\r'') are +- discarded on input. Discarding carriage return may be useful on +- terminals that send both carriage return and linefeed when you +- type the key. +- +- - Macro: tcflag_t ICRNL +- If this bit is set and `IGNCR' is not set, carriage return +- characters (`'\r'') received as input are passed to the +- application as newline characters (`'\n''). +- +- - Macro: tcflag_t INLCR +- If this bit is set, newline characters (`'\n'') received as input +- are passed to the application as carriage return characters +- (`'\r''). +- +- - Macro: tcflag_t IXOFF +- If this bit is set, start/stop control on input is enabled. In +- other words, the computer sends STOP and START characters as +- necessary to prevent input from coming in faster than programs are +- reading it. The idea is that the actual terminal hardware that is +- generating the input data responds to a STOP character by +- suspending transmission, and to a START character by resuming +- transmission. *Note Start/Stop Characters::. +- +- - Macro: tcflag_t IXON +- If this bit is set, start/stop control on output is enabled. In +- other words, if the computer receives a STOP character, it +- suspends output until a START character is received. In this +- case, the STOP and START characters are never passed to the +- application program. If this bit is not set, then START and STOP +- can be read as ordinary characters. *Note Start/Stop Characters::. +- +- - Macro: tcflag_t IXANY +- If this bit is set, any input character restarts output when +- output has been suspended with the STOP character. Otherwise, +- only the START character restarts output. +- +- This is a BSD extension; it exists only on BSD systems and the GNU +- system. +- +- - Macro: tcflag_t IMAXBEL +- If this bit is set, then filling up the terminal input buffer +- sends a BEL character (code `007') to the terminal to ring the +- bell. +- +- This is a BSD extension. +- +- +-File: libc.info, Node: Output Modes, Next: Control Modes, Prev: Input Modes, Up: Terminal Modes +- +-Output Modes +------------- +- +- This section describes the terminal flags and fields that control how +-output characters are translated and padded for display. All of these +-are contained in the `c_oflag' member of the `struct termios' structure. +- +- The `c_oflag' member itself is an integer, and you change the flags +-and fields using the operators `&', `|', and `^'. Don't try to specify +-the entire value for `c_oflag'--instead, change only specific flags and +-leave the rest untouched (*note Setting Modes::.). +- +- - Macro: tcflag_t OPOST +- If this bit is set, output data is processed in some unspecified +- way so that it is displayed appropriately on the terminal device. +- This typically includes mapping newline characters (`'\n'') onto +- carriage return and linefeed pairs. +- +- If this bit isn't set, the characters are transmitted as-is. +- +- The following three bits are BSD features, and they exist only BSD +-systems and the GNU system. They are effective only if `OPOST' is set. +- +- - Macro: tcflag_t ONLCR +- If this bit is set, convert the newline character on output into a +- pair of characters, carriage return followed by linefeed. +- +- - Macro: tcflag_t OXTABS +- If this bit is set, convert tab characters on output into the +- appropriate number of spaces to emulate a tab stop every eight +- columns. +- +- - Macro: tcflag_t ONOEOT +- If this bit is set, discard `C-d' characters (code `004') on +- output. These characters cause many dial-up terminals to +- disconnect. +- +- +-File: libc.info, Node: Control Modes, Next: Local Modes, Prev: Output Modes, Up: Terminal Modes +- +-Control Modes +-------------- +- +- This section describes the terminal flags and fields that control +-parameters usually associated with asynchronous serial data +-transmission. These flags may not make sense for other kinds of +-terminal ports (such as a network connection pseudo-terminal). All of +-these are contained in the `c_cflag' member of the `struct termios' +-structure. +- +- The `c_cflag' member itself is an integer, and you change the flags +-and fields using the operators `&', `|', and `^'. Don't try to specify +-the entire value for `c_cflag'--instead, change only specific flags and +-leave the rest untouched (*note Setting Modes::.). +- +- - Macro: tcflag_t CLOCAL +- If this bit is set, it indicates that the terminal is connected +- "locally" and that the modem status lines (such as carrier detect) +- should be ignored. +- +- On many systems if this bit is not set and you call `open' without +- the `O_NONBLOCK' flag set, `open' blocks until a modem connection +- is established. +- +- If this bit is not set and a modem disconnect is detected, a +- `SIGHUP' signal is sent to the controlling process group for the +- terminal (if it has one). Normally, this causes the process to +- exit; see *Note Signal Handling::. Reading from the terminal +- after a disconnect causes an end-of-file condition, and writing +- causes an `EIO' error to be returned. The terminal device must be +- closed and reopened to clear the condition. +- +- - Macro: tcflag_t HUPCL +- If this bit is set, a modem disconnect is generated when all +- processes that have the terminal device open have either closed +- the file or exited. +- +- - Macro: tcflag_t CREAD +- If this bit is set, input can be read from the terminal. +- Otherwise, input is discarded when it arrives. +- +- - Macro: tcflag_t CSTOPB +- If this bit is set, two stop bits are used. Otherwise, only one +- stop bit is used. +- +- - Macro: tcflag_t PARENB +- If this bit is set, generation and detection of a parity bit are +- enabled. *Note Input Modes::, for information on how input parity +- errors are handled. +- +- If this bit is not set, no parity bit is added to output +- characters, and input characters are not checked for correct +- parity. +- +- - Macro: tcflag_t PARODD +- This bit is only useful if `PARENB' is set. If `PARODD' is set, +- odd parity is used, otherwise even parity is used. +- +- The control mode flags also includes a field for the number of bits +-per character. You can use the `CSIZE' macro as a mask to extract the +-value, like this: `settings.c_cflag & CSIZE'. +- +- - Macro: tcflag_t CSIZE +- This is a mask for the number of bits per character. +- +- - Macro: tcflag_t CS5 +- This specifies five bits per byte. +- +- - Macro: tcflag_t CS6 +- This specifies six bits per byte. +- +- - Macro: tcflag_t CS7 +- This specifies seven bits per byte. +- +- - Macro: tcflag_t CS8 +- This specifies eight bits per byte. +- +- The following four bits are BSD extensions; this exist only on BSD +-systems and the GNU system. +- +- - Macro: tcflag_t CCTS_OFLOW +- If this bit is set, enable flow control of output based on the CTS +- wire (RS232 protocol). +- +- - Macro: tcflag_t CRTS_IFLOW +- If this bit is set, enable flow control of input based on the RTS +- wire (RS232 protocol). +- +- - Macro: tcflag_t MDMBUF +- If this bit is set, enable carrier-based flow control of output. +- +- - Macro: tcflag_t CIGNORE +- If this bit is set, it says to ignore the control modes and line +- speed values entirely. This is only meaningful in a call to +- `tcsetattr'. +- +- The `c_cflag' member and the line speed values returned by +- `cfgetispeed' and `cfgetospeed' will be unaffected by the call. +- `CIGNORE' is useful if you want to set all the software modes in +- the other members, but leave the hardware details in `c_cflag' +- unchanged. (This is how the `TCSASOFT' flag to `tcsettattr' +- works.) +- +- This bit is never set in the structure filled in by `tcgetattr'. +- +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 ) 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 end a line. +- Just set the ICRNL flag. In fact, this is the default state of +- affairs. +- +- - Macro: int VEOL2 +- This is the subscript for the EOL2 character in the special control +- character array. `TERMIOS.c_cc[VEOL2]' holds the character itself. +- +- The EOL2 character works just like the EOL character (see above), +- but it can be a different character. Thus, you can specify two +- characters to terminate an input line, by setting EOL to one of +- them and EOL2 to the other. +- +- The EOL2 character is a BSD extension; it exists only on BSD +- systems and the GNU system. +- +- - Macro: int VERASE +- This is the subscript for the ERASE character in the special +- control character array. `TERMIOS.c_cc[VERASE]' holds the +- character itself. +- +- The ERASE character is recognized only in canonical input mode. +- When the user types the erase character, the previous character +- typed is discarded. (If the terminal generates multibyte +- character sequences, this may cause more than one byte of input to +- be discarded.) This cannot be used to erase past the beginning of +- the current line of text. The ERASE character itself is discarded. +- +- Usually, the ERASE character is . +- +- - Macro: int VWERASE +- This is the subscript for the WERASE character in the special +- control character array. `TERMIOS.c_cc[VWERASE]' holds the +- character itself. +- +- The WERASE character is recognized only in canonical mode. It +- erases an entire word of prior input, and any whitespace after it; +- whitespace characters before the word are not erased. +- +- The definition of a "word" depends on the setting of the +- `ALTWERASE' mode; *note Local Modes::.. +- +- If the `ALTWERASE' mode is not set, a word is defined as a sequence +- of any characters except space or tab. +- +- If the `ALTWERASE' mode is set, a word is defined as a sequence of +- characters containing only letters, numbers, and underscores, +- optionally followed by one character that is not a letter, number, +- or underscore. +- +- The WERASE character is usually `C-w'. +- +- This is a BSD extension. +- +- - Macro: int VKILL +- This is the subscript for the KILL character in the special control +- character array. `TERMIOS.c_cc[VKILL]' holds the character itself. +- +- The KILL character is recognized only in canonical input mode. +- When the user types the kill character, the entire contents of the +- current line of input are discarded. The kill character itself is +- discarded too. +- +- The KILL character is usually `C-u'. +- +- - Macro: int VREPRINT +- This is the subscript for the REPRINT character in the special +- control character array. `TERMIOS.c_cc[VREPRINT]' holds the +- character itself. +- +- The REPRINT character is recognized only in canonical mode. It +- reprints the current input line. If some asynchronous output has +- come while you are typing, this lets you see the line you are +- typing clearly again. +- +- The REPRINT character is usually `C-r'. +- +- This is a BSD extension. +- +- +-File: libc.info, Node: Signal Characters, Next: Start/Stop Characters, Prev: Editing Characters, Up: Special Characters +- +-Characters that Cause Signals +-............................. +- +- These special characters may be active in either canonical or +-noncanonical input mode, but only when the `ISIG' flag is set (*note +-Local Modes::.). +- +- - Macro: int VINTR +- This is the subscript for the INTR character in the special control +- character array. `TERMIOS.c_cc[VINTR]' holds the character itself. +- +- The INTR (interrupt) character raises a `SIGINT' signal for all +- processes in the foreground job associated with the terminal. The +- INTR character itself is then discarded. *Note Signal Handling::, +- for more information about signals. +- +- Typically, the INTR character is `C-c'. +- +- - Macro: int VQUIT +- This is the subscript for the QUIT character in the special control +- character array. `TERMIOS.c_cc[VQUIT]' holds the character itself. +- +- The QUIT character raises a `SIGQUIT' signal for all processes in +- the foreground job associated with the terminal. The QUIT +- character itself is then discarded. *Note Signal Handling::, for +- more information about signals. +- +- Typically, the QUIT character is `C-\'. +- +- - Macro: int VSUSP +- This is the subscript for the SUSP character in the special control +- character array. `TERMIOS.c_cc[VSUSP]' holds the character itself. +- +- The SUSP (suspend) character is recognized only if the +- implementation supports job control (*note Job Control::.). It +- causes a `SIGTSTP' signal to be sent to all processes in the +- foreground job associated with the terminal. The SUSP character +- itself is then discarded. *Note Signal Handling::, for more +- information about signals. +- +- Typically, the SUSP character is `C-z'. +- +- Few applications disable the normal interpretation of the SUSP +-character. If your program does this, it should provide some other +-mechanism for the user to stop the job. When the user invokes this +-mechanism, the program should send a `SIGTSTP' signal to the process +-group of the process, not just to the process itself. *Note Signaling +-Another Process::. +- +- - Macro: int VDSUSP +- This is the subscript for the DSUSP character in the special +- control character array. `TERMIOS.c_cc[VDSUSP]' holds the +- character itself. +- +- The DSUSP (suspend) character is recognized only if the +- implementation supports job control (*note Job Control::.). It +- sends a `SIGTSTP' signal, like the SUSP character, but not right +- away--only when the program tries to read it as input. Not all +- systems with job control support DSUSP; only BSD-compatible +- systems (including the GNU system). +- +- *Note Signal Handling::, for more information about signals. +- +- Typically, the DSUSP character is `C-y'. +- +- +-File: libc.info, Node: Start/Stop Characters, Next: Other Special, Prev: Signal Characters, Up: Special Characters +- +-Special Characters for Flow Control +-................................... +- +- These special characters may be active in either canonical or +-noncanonical input mode, but their use is controlled by the flags +-`IXON' and `IXOFF' (*note Input Modes::.). +- +- - Macro: int VSTART +- This is the subscript for the START character in the special +- control character array. `TERMIOS.c_cc[VSTART]' holds the +- character itself. +- +- The START character is used to support the `IXON' and `IXOFF' +- input modes. If `IXON' is set, receiving a START character resumes +- suspended output; the START character itself is discarded. If +- `IXANY' is set, receiving any character at all resumes suspended +- output; the resuming character is not discarded unless it is the +- START character. `IXOFF' is set, the system may also transmit +- START characters to the terminal. +- +- The usual value for the START character is `C-q'. You may not be +- able to change this value--the hardware may insist on using `C-q' +- regardless of what you specify. +- +- - Macro: int VSTOP +- This is the subscript for the STOP character in the special control +- character array. `TERMIOS.c_cc[VSTOP]' holds the character itself. +- +- The STOP character is used to support the `IXON' and `IXOFF' input +- modes. If `IXON' is set, receiving a STOP character causes output +- to be suspended; the STOP character itself is discarded. If +- `IXOFF' is set, the system may also transmit STOP characters to the +- terminal, to prevent the input queue from overflowing. +- +- The usual value for the STOP character is `C-s'. You may not be +- able to change this value--the hardware may insist on using `C-s' +- regardless of what you specify. +- +- +-File: libc.info, Node: Other Special, Prev: Start/Stop Characters, Up: Special Characters +- +-Other Special Characters +-........................ +- +- These special characters exist only in BSD systems and the GNU +-system. +- +- - Macro: int VLNEXT +- This is the subscript for the LNEXT character in the special +- control character array. `TERMIOS.c_cc[VLNEXT]' holds the +- character itself. +- +- The LNEXT character is recognized only when `IEXTEN' is set, but in +- both canonical and noncanonical mode. It disables any special +- significance of the next character the user types. Even if the +- character would normally perform some editing function or generate +- a signal, it is read as a plain character. This is the analogue +- of the `C-q' command in Emacs. "LNEXT" stands for "literal next." +- +- The LNEXT character is usually `C-v'. +- +- - Macro: int VDISCARD +- This is the subscript for the DISCARD character in the special +- control character array. `TERMIOS.c_cc[VDISCARD]' holds the +- character itself. +- +- The DISCARD character is recognized only when `IEXTEN' is set, but +- in both canonical and noncanonical mode. Its effect is to toggle +- the discard-output flag. When this flag is set, all program +- output is discarded. Setting the flag also discards all output +- currently in the output buffer. Typing any other character resets +- the flag. +- +- - Macro: int VSTATUS +- This is the subscript for the STATUS character in the special +- control character array. `TERMIOS.c_cc[VSTATUS]' holds the +- character itself. +- +- The STATUS character's effect is to print out a status message +- about how the current process is running. +- +- The STATUS character is recognized only in canonical mode, and +- only if `NOKERNINFO' is not set. +- +- +-File: libc.info, Node: Noncanonical Input, Prev: Special Characters, Up: Terminal Modes +- +-Noncanonical Input +------------------- +- +- In noncanonical input mode, the special editing characters such as +-ERASE and KILL are ignored. The system facilities for the user to edit +-input are disabled in noncanonical mode, so that all input characters +-(unless they are special for signal or flow-control purposes) are passed +-to the application program exactly as typed. It is up to the +-application program to give the user ways to edit the input, if +-appropriate. +- +- Noncanonical mode offers special parameters called MIN and TIME for +-controlling whether and how long to wait for input to be available. You +-can even use them to avoid ever waiting--to return immediately with +-whatever input is available, or with no input. +- +- The MIN and TIME are stored in elements of the `c_cc' array, which +-is a member of the `struct termios' structure. Each element of this +-array has a particular role, and each element has a symbolic constant +-that stands for the index of that element. `VMIN' and `VMAX' are the +-names for the indices in the array of the MIN and TIME slots. +- +- - Macro: int VMIN +- This is the subscript for the MIN slot in the `c_cc' array. Thus, +- `TERMIOS.c_cc[VMIN]' is the value itself. +- +- The MIN slot is only meaningful in noncanonical input mode; it +- specifies the minimum number of bytes that must be available in the +- input queue in order for `read' to return. +- +- - Macro: int VTIME +- This is the subscript for the TIME slot in the `c_cc' array. Thus, +- `TERMIOS.c_cc[VTIME]' is the value itself. +- +- The TIME slot is only meaningful in noncanonical input mode; it +- specifies how long to wait for input before returning, in units of +- 0.1 seconds. +- +- The MIN and TIME values interact to determine the criterion for when +-`read' should return; their precise meanings depend on which of them +-are nonzero. There are four possible cases: +- +- * Both TIME and MIN are nonzero. +- +- In this case, TIME specifies how long to wait after each input +- character to see if more input arrives. After the first character +- received, `read' keeps waiting until either MIN bytes have arrived +- in all, or TIME elapses with no further input. +- +- `read' always blocks until the first character arrives, even if +- TIME elapses first. `read' can return more than MIN characters if +- more than MIN happen to be in the queue. +- +- * Both MIN and TIME are zero. +- +- In this case, `read' always returns immediately with as many +- characters as are available in the queue, up to the number +- requested. If no input is immediately available, `read' returns a +- value of zero. +- +- * MIN is zero but TIME has a nonzero value. +- +- In this case, `read' waits for time TIME for input to become +- available; the availability of a single byte is enough to satisfy +- the read request and cause `read' to return. When it returns, it +- returns as many characters as are available, up to the number +- requested. If no input is available before the timer expires, +- `read' returns a value of zero. +- +- * TIME is zero but MIN has a nonzero value. +- +- In this case, `read' waits until at least MIN bytes are available +- in the queue. At that time, `read' returns as many characters as +- are available, up to the number requested. `read' can return more +- than MIN characters if more than MIN happen to be in the queue. +- +- What happens if MIN is 50 and you ask to read just 10 bytes? +-Normally, `read' waits until there are 50 bytes in the buffer (or, more +-generally, the wait condition described above is satisfied), and then +-reads 10 of them, leaving the other 40 buffered in the operating system +-for a subsequent call to `read'. +- +- *Portability note:* On some systems, the MIN and TIME slots are +-actually the same as the EOF and EOL slots. This causes no serious +-problem because the MIN and TIME slots are used only in noncanonical +-input and the EOF and EOL slots are used only in canonical input, but it +-isn't very clean. The GNU library allocates separate slots for these +-uses. +- +- - Function: 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 +- #include +- #include +- #include +- +- /* Use this variable to remember original terminal attributes. */ +- +- struct termios saved_attributes; +- +- void +- reset_input_mode (void) +- { +- tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes); +- } +- +- void +- set_input_mode (void) +- { +- struct termios tattr; +- char *name; +- +- /* Make sure stdin is a terminal. */ +- if (!isatty (STDIN_FILENO)) +- { +- fprintf (stderr, "Not a terminal.\n"); +- exit (EXIT_FAILURE); +- } +- +- /* Save the terminal attributes so we can restore them later. */ +- tcgetattr (STDIN_FILENO, &saved_attributes); +- atexit (reset_input_mode); +- /* Set the funny terminal modes. */ +- tcgetattr (STDIN_FILENO, &tattr); +- tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */ +- tattr.c_cc[VMIN] = 1; +- tattr.c_cc[VTIME] = 0; +- tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); +- } +- +- int +- main (void) +- { +- char c; +- +- set_input_mode (); +- +- while (1) +- { +- read (STDIN_FILENO, &c, 1); +- if (c == '\004') /* `C-d' */ +- break; +- else +- putchar (c); +- } +- +- return EXIT_SUCCESS; +- } +- +- This program is careful to restore the original terminal modes before +-exiting or terminating with a signal. It uses the `atexit' function +-(*note Cleanups on Exit::.) to make sure this is done by `exit'. +- +- The shell is supposed to take care of resetting the terminal modes +-when a process is stopped or continued; see *Note Job Control::. But +-some existing shells do not actually do this, so you may wish to +-establish handlers for job control signals that reset terminal modes. +-The above example does so. +- +- +-File: libc.info, Node: Pseudo-Terminals, Prev: Noncanon Example, Up: Low-Level Terminal Interface +- +-Pseudo-Terminals +-================ +- +- A "pseudo-terminal" is a special interprocess communication channel +-that acts like a terminal. One end of the channel is called the +-"master" side or "master pseudo-terminal device", the other side is +-called the "slave" side. Data written to the master side is received +-by the slave side as if it was the result of a user typing at an +-ordinary terminal, and data written to the slave side is sent to the +-master side as if it was written on an ordinary terminal. +- +- Pseudo terminals are the way programs like `xterm' and `emacs' +-implement their terminal emulation functionality. +- +-* Menu: +- +-* Allocation:: Allocating a pseudo terminal. +-* Pseudo-Terminal Pairs:: How to open both sides of a +- pseudo-terminal in a single operation. +- +- +-File: libc.info, Node: Allocation, Next: Pseudo-Terminal Pairs, Up: Pseudo-Terminals +- +-Allocating Pseudo-Terminals +---------------------------- +- +- This subsection describes functions for allocating a pseudo-terminal, +-and for making this pseudo-terminal available for actual use. These +-functions are declared in the header file `stdlib.h'. +- +- - Function: int getpt (void) +- The `getpt' function returns a new file descriptor for the next +- available master pseudo-terminal. The normal return value from +- `getpt' is a non-negative integer file descriptor. In the case of +- an error, a value of -1 is returned instead. The following +- `errno' conditions are defined for this function: +- +- `ENOENT' +- There are no free master pseudo-terminals available. +- +- This function is a GNU extension. +- +- - Function: int grantpt (int FILEDES) +- The `grantpt' function changes the ownership and access permission +- of the slave pseudo-terminal device corresponding to the master +- pseudo-terminal device associated with the file descriptor +- FILEDES. The owner is set from the real user ID of the calling +- process (*note Process Persona::.), and the group is set to a +- special group (typically "tty") or from the real group ID of the +- calling process. The access permission is set such that the file +- is both readable and writable by the owner and only writable by +- the group. +- +- On some systems this function is implemented by invoking a special +- `setuid' root program (*note How Change Persona::.). As a +- consequence, installing a signal handler for the `SIGCHLD' signal +- (*note Job Control Signals::.) may interfere with a call to +- `grantpt'. +- +- The normal return value from `grantpt' is 0; a value of -1 is +- returned in case of failure. The following `errno' error +- conditions are defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `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 +- #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 +- +- 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 +- #include +- #include +- #include +- +- FILE * +- open_sesame (char *name) +- { +- FILE *stream; +- +- errno = 0; +- stream = fopen (name, "r"); +- if (stream == NULL) +- { +- fprintf (stderr, "%s: Couldn't open file %s; %s\n", +- program_invocation_short_name, name, strerror (errno)); +- exit (EXIT_FAILURE); +- } +- else +- return stream; +- } +- +- +-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 +- #include +- +- #define SIZE 256 +- +- int +- main (void) +- { +- char buffer[SIZE]; +- time_t curtime; +- struct tm *loctime; +- +- /* Get the current time. */ +- curtime = time (NULL); +- +- /* Convert it to local time representation. */ +- loctime = localtime (&curtime); +- +- /* Print out the date and time in the standard format. */ +- fputs (asctime (loctime), stdout); +- /* Print it out in a nice format. */ +- strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime); +- fputs (buffer, stdout); +- strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime); +- fputs (buffer, stdout); +- +- return 0; +- } +- +- It produces output like this: +- +- Wed Jul 31 13:02:36 1991 +- Today is Wednesday, July 31. +- The time is 01:02 PM. +- +diff -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 +- #include +- #include +- +- jmp_buf main_loop; +- +- void +- abort_to_main_loop (int status) +- { +- longjmp (main_loop, status); +- } +- +- int +- main (void) +- { +- while (1) +- if (setjmp (main_loop)) +- puts ("Back at main loop...."); +- else +- do_command (); +- } +- +- +- void +- do_command (void) +- { +- char buffer[128]; +- if (fgets (buffer, 128, stdin) == NULL) +- abort_to_main_loop (-1); +- else +- exit (EXIT_SUCCESS); +- } +- +- The function `abort_to_main_loop' causes an immediate transfer of +-control back to the main loop of the program, no matter where it is +-called from. +- +- The flow of control inside the `main' function may appear a little +-mysterious at first, but it is actually a common idiom with `setjmp'. +-A normal call to `setjmp' returns zero, so the "else" clause of the +-conditional is executed. If `abort_to_main_loop' is called somewhere +-within the execution of `do_command', then it actually appears as if +-the *same* call to `setjmp' in `main' were returning a second time with +-a value of `-1'. +- +- So, the general pattern for using `setjmp' looks something like: +- +- if (setjmp (BUFFER)) +- /* Code to clean up after premature return. */ +- ... +- else +- /* Code to be executed normally after setting up the return point. */ +- ... +- +- +-File: libc.info, Node: Non-Local Details, Next: Non-Local Exits and Signals, Prev: Non-Local Intro, Up: Non-Local Exits +- +-Details of Non-Local Exits +-========================== +- +- Here are the details on the functions and data structures used for +-performing non-local exits. These facilities are declared in +-`setjmp.h'. +- +- - Data Type: jmp_buf +- Objects of type `jmp_buf' hold the state information to be +- restored by a non-local exit. The contents of a `jmp_buf' +- identify a specific place to return to. +- +- - Macro: int setjmp (jmp_buf STATE) +- When called normally, `setjmp' stores information about the +- execution state of the program in STATE and returns zero. If +- `longjmp' is later used to perform a non-local exit to this STATE, +- `setjmp' returns a nonzero value. +- +- - Function: void longjmp (jmp_buf STATE, int VALUE) +- This function restores current execution to the state saved in +- STATE, and continues execution from the call to `setjmp' that +- established that return point. Returning from `setjmp' by means of +- `longjmp' returns the VALUE argument that was passed to `longjmp', +- rather than `0'. (But if VALUE is given as `0', `setjmp' returns +- `1'). +- +- There are a lot of obscure but important restrictions on the use of +-`setjmp' and `longjmp'. Most of these restrictions are present because +-non-local exits require a fair amount of magic on the part of the C +-compiler and can interact with other parts of the language in strange +-ways. +- +- The `setjmp' function is actually a macro without an actual function +-definition, so you shouldn't try to `#undef' it or take its address. +-In addition, calls to `setjmp' are safe in only the following contexts: +- +- * As the test expression of a selection or iteration statement (such +- as `if', `switch', or `while'). +- +- * As one operand of a equality or comparison operator that appears +- as the test expression of a selection or iteration statement. The +- other operand must be an integer constant expression. +- +- * As the operand of a unary `!' operator, that appears as the test +- expression of a selection or iteration statement. +- +- * By itself as an expression statement. +- +- Return points are valid only during the dynamic extent of the +-function that called `setjmp' to establish them. If you `longjmp' to a +-return point that was established in a function that has already +-returned, unpredictable and disastrous things are likely to happen. +- +- You should use a nonzero VALUE argument to `longjmp'. While +-`longjmp' refuses to pass back a zero argument as the return value from +-`setjmp', this is intended as a safety net against accidental misuse +-and is not really good programming style. +- +- When you perform a non-local exit, accessible objects generally +-retain whatever values they had at the time `longjmp' was called. The +-exception is that the values of automatic variables local to the +-function containing the `setjmp' call that have been changed since the +-call to `setjmp' are indeterminate, unless you have declared them +-`volatile'. +- +- +-File: libc.info, Node: Non-Local Exits and Signals, 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 +- +- 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 +- +- void +- termination_handler (int signum) +- { +- struct temp_file *p; +- +- for (p = temp_file_list; p; p = p->next) +- unlink (p->name); +- } +- +- int +- main (void) +- { +- ... +- struct sigaction new_action, old_action; +- +- /* Set up the structure to specify the new action. */ +- new_action.sa_handler = termination_handler; +- sigemptyset (&new_action.sa_mask); +- new_action.sa_flags = 0; +- +- sigaction (SIGINT, NULL, &old_action); +- if (old_action.sa_handler != SIG_IGN) +- sigaction (SIGINT, &new_action, NULL); +- sigaction (SIGHUP, NULL, &old_action); +- if (old_action.sa_handler != SIG_IGN) +- sigaction (SIGHUP, &new_action, NULL); +- sigaction (SIGTERM, NULL, &old_action); +- if (old_action.sa_handler != SIG_IGN) +- sigaction (SIGTERM, &new_action, NULL); +- ... +- } +- +- The program just loads the `new_action' structure with the desired +-parameters and passes it in the `sigaction' call. The usage of +-`sigemptyset' is described later; see *Note Blocking Signals::. +- +- As in the example using `signal', we avoid handling signals +-previously set to be ignored. Here we can avoid altering the signal +-handler even momentarily, by using the feature of `sigaction' that lets +-us examine the current action without specifying a new one. +- +- Here is another example. It retrieves information about the current +-action for `SIGINT' without changing that action. +- +- struct sigaction query_action; +- +- if (sigaction (SIGINT, NULL, &query_action) < 0) +- /* `sigaction' returns -1 in case of error. */ +- else if (query_action.sa_handler == SIG_DFL) +- /* `SIGINT' is handled in the default, fatal manner. */ +- else if (query_action.sa_handler == SIG_IGN) +- /* `SIGINT' is ignored. */ +- else +- /* A programmer-defined signal handler is in effect. */ +- +- +-File: libc.info, Node: Flags for Sigaction, Next: Initial Signal Actions, Prev: Sigaction Function Example, Up: Signal Actions +- +-Flags for `sigaction' +---------------------- +- +- The `sa_flags' member of the `sigaction' structure is a catch-all +-for special features. Most of the time, `SA_RESTART' is a good value +-to use for this field. +- +- The value of `sa_flags' is interpreted as a bit mask. Thus, you +-should choose the flags you want to set, OR those flags together, and +-store the result in the `sa_flags' member of your `sigaction' structure. +- +- Each signal number has its own set of flags. Each call to +-`sigaction' affects one particular signal number, and the flags that +-you specify apply only to that particular signal. +- +- In the GNU C library, establishing a handler with `signal' sets all +-the flags to zero except for `SA_RESTART', whose value depends on the +-settings you have made with `siginterrupt'. *Note Interrupted +-Primitives::, to see what this is about. +- +- These macros are defined in the header file `signal.h'. +- +- - Macro: int SA_NOCLDSTOP +- This flag is meaningful only for the `SIGCHLD' signal. When the +- flag is set, the system delivers the signal for a terminated child +- process but not for one that is stopped. By default, `SIGCHLD' is +- delivered for both terminated children and stopped children. +- +- Setting this flag for a signal other than `SIGCHLD' has no effect. +- +- - Macro: int SA_ONSTACK +- If this flag is set for a particular signal number, the system +- uses the signal stack when delivering that kind of signal. *Note +- Signal Stack::. If a signal with this flag arrives and you have +- not set a signal stack, the system terminates the program with +- `SIGILL'. +- +- - Macro: int SA_RESTART +- This flag controls what happens when a signal is delivered during +- certain primitives (such as `open', `read' or `write'), and the +- signal handler returns normally. There are two alternatives: the +- library function can resume, or it can return failure with error +- code `EINTR'. +- +- The choice is controlled by the `SA_RESTART' flag for the +- particular kind of signal that was delivered. If the flag is set, +- returning from a handler resumes the library function. If the +- flag is clear, returning from a handler makes the function fail. +- *Note Interrupted Primitives::. +- +- +-File: libc.info, Node: Initial Signal Actions, Prev: Flags for Sigaction, Up: Signal Actions +- +-Initial Signal Actions +----------------------- +- +- When a new process is created (*note Creating a Process::.), it +-inherits handling of signals from its parent process. However, when +-you load a new process image using the `exec' function (*note Executing +-a File::.), any signals that you've defined your own handlers for +-revert to their `SIG_DFL' handling. (If you think about it a little, +-this makes sense; the handler functions from the old program are +-specific to that program, and aren't even present in the address space +-of the new program image.) Of course, the new program can establish +-its own handlers. +- +- When a program is run by a shell, the shell normally sets the initial +-actions for the child process to `SIG_DFL' or `SIG_IGN', as +-appropriate. It's a good idea to check to make sure that the shell has +-not set up an initial action of `SIG_IGN' before you establish your own +-signal handlers. +- +- Here is an example of how to establish a handler for `SIGHUP', but +-not if `SIGHUP' is currently ignored: +- +- ... +- struct sigaction temp; +- +- sigaction (SIGHUP, NULL, &temp); +- +- if (temp.sa_handler != SIG_IGN) +- { +- temp.sa_handler = handle_sighup; +- sigemptyset (&temp.sa_mask); +- sigaction (SIGHUP, &temp, NULL); +- } +- +- +-File: libc.info, Node: Defining Handlers, Next: Interrupted Primitives, Prev: Signal Actions, Up: Signal Handling +- +-Defining Signal Handlers +-======================== +- +- This section describes how to write a signal handler function that +-can be established with the `signal' or `sigaction' functions. +- +- A signal handler is just a function that you compile together with +-the rest of the program. Instead of directly invoking the function, +-you use `signal' or `sigaction' to tell the operating system to call it +-when a signal arrives. This is known as "establishing" the handler. +-*Note Signal Actions::. +- +- There are two basic strategies you can use in signal handler +-functions: +- +- * You can have the handler function note that the signal arrived by +- tweaking some global data structures, and then return normally. +- +- * You can have the handler function terminate the program or transfer +- control to a point where it can recover from the situation that +- caused the signal. +- +- You need to take special care in writing handler functions because +-they can be called asynchronously. That is, a handler might be called +-at any point in the program, unpredictably. If two signals arrive +-during a very short interval, one handler can run within another. This +-section describes what your handler should do, and what you should +-avoid. +- +-* Menu: +- +-* Handler Returns:: Handlers that return normally, and what +- this means. +-* Termination in Handler:: How handler functions terminate a program. +-* Longjmp in Handler:: Nonlocal transfer of control out of a +- signal handler. +-* Signals in Handler:: What happens when signals arrive while +- the handler is already occupied. +-* Merged Signals:: When a second signal arrives before the +- first is handled. +-* Nonreentrancy:: Do not call any functions unless you know they +- are reentrant with respect to signals. +-* Atomic Data Access:: A single handler can run in the middle of +- reading or writing a single object. +- +- +-File: libc.info, Node: Handler Returns, Next: Termination in Handler, Up: Defining Handlers +- +-Signal Handlers that Return +---------------------------- +- +- Handlers which return normally are usually used for signals such as +-`SIGALRM' and the I/O and interprocess communication signals. But a +-handler for `SIGINT' might also return normally after setting a flag +-that tells the program to exit at a convenient time. +- +- It is not safe to return normally from the handler for a program +-error signal, because the behavior of the program when the handler +-function returns is not defined after a program error. *Note Program +-Error Signals::. +- +- Handlers that return normally must modify some global variable in +-order to have any effect. Typically, the variable is one that is +-examined periodically by the program during normal operation. Its data +-type should be `sig_atomic_t' for reasons described in *Note Atomic +-Data Access::. +- +- Here is a simple example of such a program. It executes the body of +-the loop until it has noticed that a `SIGALRM' signal has arrived. +-This technique is useful because it allows the iteration in progress +-when the signal arrives to complete before the loop exits. +- +- #include +- #include +- #include +- +- /* This flag controls termination of the main loop. */ +- volatile sig_atomic_t keep_going = 1; +- +- /* The signal handler just clears the flag and re-enables itself. */ +- void +- catch_alarm (int sig) +- { +- keep_going = 0; +- signal (sig, catch_alarm); +- } +- +- void +- do_stuff (void) +- { +- puts ("Doing stuff while waiting for alarm...."); +- } +- +- int +- main (void) +- { +- /* Establish a handler for SIGALRM signals. */ +- signal (SIGALRM, catch_alarm); +- +- /* Set an alarm to go off in a little while. */ +- alarm (2); +- +- /* Check the flag once in a while to see when to quit. */ +- while (keep_going) +- do_stuff (); +- +- return EXIT_SUCCESS; +- } +- +- +-File: libc.info, Node: Termination in Handler, Next: Longjmp in Handler, Prev: Handler Returns, Up: Defining Handlers +- +-Handlers That Terminate the Process +------------------------------------ +- +- Handler functions that terminate the program are typically used to +-cause orderly cleanup or recovery from program error signals and +-interactive interrupts. +- +- The cleanest way for a handler to terminate the process is to raise +-the same signal that ran the handler in the first place. Here is how +-to do this: +- +- volatile sig_atomic_t fatal_error_in_progress = 0; +- +- void +- fatal_error_signal (int sig) +- { +- /* Since this handler is established for more than one kind of signal, +- it might still get invoked recursively by delivery of some other kind +- of signal. Use a static variable to keep track of that. */ +- if (fatal_error_in_progress) +- raise (sig); +- fatal_error_in_progress = 1; +- +- /* Now do the clean up actions: +- - reset terminal modes +- - kill child processes +- - remove lock files */ +- ... +- +- /* Now reraise the signal. We reactivate the signal's +- default handling, which is to terminate the process. +- We could just call `exit' or `abort', +- but reraising the signal sets the return status +- from the process correctly. */ +- signal (sig, SIG_DFL); +- raise (sig); +- } +- +- +-File: libc.info, Node: Longjmp in Handler, Next: Signals in Handler, Prev: Termination in Handler, Up: Defining Handlers +- +-Nonlocal Control Transfer in Handlers +-------------------------------------- +- +- You can do a nonlocal transfer of control out of a signal handler +-using the `setjmp' and `longjmp' facilities (*note Non-Local Exits::.). +- +- When the handler does a nonlocal control transfer, the part of the +-program that was running will not continue. If this part of the program +-was in the middle of updating an important data structure, the data +-structure will remain inconsistent. Since the program does not +-terminate, the inconsistency is likely to be noticed later on. +- +- There are two ways to avoid this problem. One is to block the signal +-for the parts of the program that update important data structures. +-Blocking the signal delays its delivery until it is unblocked, once the +-critical updating is finished. *Note Blocking Signals::. +- +- The other way to re-initialize the crucial data structures in the +-signal handler, or make their values consistent. +- +- Here is a rather schematic example showing the reinitialization of +-one global variable. +- +- #include +- #include +- +- jmp_buf return_to_top_level; +- +- volatile sig_atomic_t waiting_for_input; +- +- void +- handle_sigint (int signum) +- { +- /* We may have been waiting for input when the signal arrived, +- but we are no longer waiting once we transfer control. */ +- waiting_for_input = 0; +- longjmp (return_to_top_level, 1); +- } +- +- int +- main (void) +- { +- ... +- signal (SIGINT, sigint_handler); +- ... +- while (1) { +- prepare_for_command (); +- if (setjmp (return_to_top_level) == 0) +- read_and_execute_command (); +- } +- } +- +- /* Imagine this is a subroutine used by various commands. */ +- char * +- read_data () +- { +- if (input_from_terminal) { +- waiting_for_input = 1; +- ... +- waiting_for_input = 0; +- } else { +- ... +- } +- } +- +diff -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 +- #include +- +- struct two_words { int a, b; } memory; +- +- void +- handler(int signum) +- { +- printf ("%d,%d\n", memory.a, memory.b); +- alarm (1); +- } +- int +- main (void) +- { +- static struct two_words zeros = { 0, 0 }, ones = { 1, 1 }; +- signal (SIGALRM, handler); +- memory = zeros; +- alarm (1); +- while (1) +- { +- memory = zeros; +- memory = ones; +- } +- } +- +- This program fills `memory' with zeros, ones, zeros, ones, +-alternating forever; meanwhile, once per second, the alarm signal +-handler prints the current contents. (Calling `printf' in the handler +-is safe in this program because it is certainly not being called outside +-the handler when the signal happens.) +- +- Clearly, this program can print a pair of zeros or a pair of ones. +-But that's not all it can do! On most machines, it takes several +-instructions to store a new value in `memory', and the value is stored +-one word at a time. If the signal is delivered in between these +-instructions, the handler might find that `memory.a' is zero and +-`memory.b' is one (or vice versa). +- +- On some machines it may be possible to store a new value in `memory' +-with just one instruction that cannot be interrupted. On these +-machines, the handler will always print two zeros or two ones. +- +- +-File: libc.info, Node: Atomic Types, Next: Atomic Usage, Prev: Non-atomic Example, Up: Atomic Data Access +- +-Atomic Types +-............ +- +- To avoid uncertainty about interrupting access to a variable, you can +-use a particular data type for which access is always atomic: +-`sig_atomic_t'. Reading and writing this data type is guaranteed to +-happen in a single instruction, so there's no way for a handler to run +-"in the middle" of an access. +- +- The type `sig_atomic_t' is always an integer data type, but which +-one it is, and how many bits it contains, may vary from machine to +-machine. +- +- - Data Type: sig_atomic_t +- This is an integer data type. Objects of this type are always +- accessed atomically. +- +- In practice, you can assume that `int' and other integer types no +-longer than `int' are atomic. You can also assume that pointer types +-are atomic; that is very convenient. Both of these are true on all of +-the machines that the GNU C library supports, and on all POSIX systems +-we know of. +- +- +-File: libc.info, Node: Atomic Usage, Prev: Atomic Types, Up: Atomic Data Access +- +-Atomic Usage Patterns +-..................... +- +- Certain patterns of access avoid any problem even if an access is +-interrupted. For example, a flag which is set by the handler, and +-tested and cleared by the main program from time to time, is always safe +-even if access actually requires two instructions. To show that this is +-so, we must consider each access that could be interrupted, and show +-that there is no problem if it is interrupted. +- +- An interrupt in the middle of testing the flag is safe because +-either it's recognized to be nonzero, in which case the precise value +-doesn't matter, or it will be seen to be nonzero the next time it's +-tested. +- +- An interrupt in the middle of clearing the flag is no problem because +-either the value ends up zero, which is what happens if a signal comes +-in just before the flag is cleared, or the value ends up nonzero, and +-subsequent events occur as if the signal had come in just after the flag +-was cleared. As long as the code handles both of these cases properly, +-it can also handle a signal in the middle of clearing the flag. (This +-is an example of the sort of reasoning you need to do to figure out +-whether non-atomic usage is safe.) +- +- Sometimes you can insure uninterrupted access to one object by +-protecting its use with another object, perhaps one whose type +-guarantees atomicity. *Note Merged Signals::, for an example. +- +- +-File: libc.info, Node: Interrupted Primitives, Next: Generating Signals, Prev: Defining Handlers, Up: Signal Handling +- +-Primitives Interrupted by Signals +-================================= +- +- A signal can arrive and be handled while an I/O primitive such as +-`open' or `read' is waiting for an I/O device. If the signal handler +-returns, the system faces the question: what should happen next? +- +- POSIX specifies one approach: make the primitive fail right away. +-The error code for this kind of failure is `EINTR'. This is flexible, +-but usually inconvenient. Typically, POSIX applications that use signal +-handlers must check for `EINTR' after each library function that can +-return it, in order to try the call again. Often programmers forget to +-check, which is a common source of error. +- +- The GNU library provides a convenient way to retry a call after a +-temporary failure, with the macro `TEMP_FAILURE_RETRY': +- +- - Macro: TEMP_FAILURE_RETRY (EXPRESSION) +- This macro evaluates EXPRESSION once. If it fails and reports +- error code `EINTR', `TEMP_FAILURE_RETRY' evaluates it again, and +- over and over until the result is not a temporary failure. +- +- The value returned by `TEMP_FAILURE_RETRY' is whatever value +- EXPRESSION produced. +- +- BSD avoids `EINTR' entirely and provides a more convenient approach: +-to restart the interrupted primitive, instead of making it fail. If +-you choose this approach, you need not be concerned with `EINTR'. +- +- You can choose either approach with the GNU library. If you use +-`sigaction' to establish a signal handler, you can specify how that +-handler should behave. If you specify the `SA_RESTART' flag, return +-from that handler will resume a primitive; otherwise, return from that +-handler will cause `EINTR'. *Note Flags for Sigaction::. +- +- Another way to specify the choice is with the `siginterrupt' +-function. *Note BSD Handler::. +- +- When you don't specify with `sigaction' or `siginterrupt' what a +-particular handler should do, it uses a default choice. The default +-choice in the GNU library depends on the feature test macros you have +-defined. If you define `_BSD_SOURCE' or `_GNU_SOURCE' before calling +-`signal', the default is to resume primitives; otherwise, the default +-is to make them fail with `EINTR'. (The library contains alternate +-versions of the `signal' function, and the feature test macros +-determine which one you really call.) *Note Feature Test Macros::. +- +- The description of each primitive affected by this issue lists +-`EINTR' among the error codes it can return. +- +- There is one situation where resumption never happens no matter which +-choice you make: when a data-transfer function such as `read' or +-`write' is interrupted by a signal after transferring part of the data. +-In this case, the function returns the number of bytes already +-transferred, indicating partial success. +- +- This might at first appear to cause unreliable behavior on +-record-oriented devices (including datagram sockets; *note +-Datagrams::.), where splitting one `read' or `write' into two would +-read or write two records. Actually, there is no problem, because +-interruption after a partial transfer cannot happen on such devices; +-they always transfer an entire record in one burst, with no waiting +-once data transfer has started. +- +- +-File: libc.info, Node: Generating Signals, Next: Blocking Signals, Prev: Interrupted Primitives, Up: Signal Handling +- +-Generating Signals +-================== +- +- Besides signals that are generated as a result of a hardware trap or +-interrupt, your program can explicitly send signals to itself or to +-another process. +- +-* Menu: +- +-* Signaling Yourself:: A process can send a signal to itself. +-* Signaling Another Process:: Send a signal to another process. +-* Permission for kill:: Permission for using `kill'. +-* Kill Example:: Using `kill' for Communication. +- +- +-File: libc.info, Node: Signaling Yourself, Next: Signaling Another Process, Up: Generating Signals +- +-Signaling Yourself +------------------- +- +- A process can send itself a signal with the `raise' function. This +-function is declared in `signal.h'. +- +- - Function: int raise (int SIGNUM) +- The `raise' function sends the signal SIGNUM to the calling +- process. It returns zero if successful and a nonzero value if it +- fails. About the only reason for failure would be if the value of +- SIGNUM is invalid. +- +- - Function: int gsignal (int SIGNUM) +- The `gsignal' function does the same thing as `raise'; it is +- provided only for compatibility with SVID. +- +- One convenient use for `raise' is to reproduce the default behavior +-of a signal that you have trapped. For instance, suppose a user of your +-program types the SUSP character (usually `C-z'; *note Special +-Characters::.) to send it an interactive stop signal (`SIGTSTP'), and +-you want to clean up some internal data buffers before stopping. You +-might set this up like this: +- +- #include +- +- /* When a stop signal arrives, set the action back to the default +- and then resend the signal after doing cleanup actions. */ +- +- void +- tstp_handler (int sig) +- { +- signal (SIGTSTP, SIG_DFL); +- /* Do cleanup actions here. */ +- ... +- raise (SIGTSTP); +- } +- +- /* When the process is continued again, restore the signal handler. */ +- +- void +- cont_handler (int sig) +- { +- signal (SIGCONT, cont_handler); +- signal (SIGTSTP, tstp_handler); +- } +- /* Enable both handlers during program initialization. */ +- +- int +- main (void) +- { +- signal (SIGCONT, cont_handler); +- signal (SIGTSTP, tstp_handler); +- ... +- } +- +- *Portability note:* `raise' was invented by the ISO C committee. +-Older systems may not support it, so using `kill' may be more portable. +-*Note Signaling Another Process::. +- +- +-File: libc.info, Node: Signaling Another Process, Next: Permission for kill, Prev: Signaling Yourself, Up: Generating Signals +- +-Signaling Another Process +-------------------------- +- +- The `kill' function can be used to send a signal to another process. +-In spite of its name, it can be used for a lot of things other than +-causing a process to terminate. Some examples of situations where you +-might want to send signals between processes are: +- +- * A parent process starts a child to perform a task--perhaps having +- the child running an infinite loop--and then terminates the child +- when the task is no longer needed. +- +- * A process executes as part of a group, and needs to terminate or +- notify the other processes in the group when an error or other +- event occurs. +- +- * Two processes need to synchronize while working together. +- +- This section assumes that you know a little bit about how processes +-work. For more information on this subject, see *Note Processes::. +- +- The `kill' function is declared in `signal.h'. +- +- - Function: int kill (pid_t PID, int SIGNUM) +- The `kill' function sends the signal SIGNUM to the process or +- process group specified by PID. Besides the signals listed in +- *Note Standard Signals::, SIGNUM can also have a value of zero to +- check the validity of the PID. +- +- The PID specifies the process or process group to receive the +- signal: +- +- `PID > 0' +- The process whose identifier is PID. +- +- `PID == 0' +- All processes in the same process group as the sender. +- +- `PID < -1' +- The process group whose identifier is -PID. +- +- `PID == -1' +- If the process is privileged, send the signal to all +- processes except for some special system processes. +- Otherwise, send the signal to all processes with the same +- effective user ID. +- +- A process can send a signal to itself with a call like +- `kill (getpid(), SIGNUM)'. If `kill' is used by a process to send +- a signal to itself, and the signal is not blocked, then `kill' +- delivers at least one signal (which might be some other pending +- unblocked signal instead of the signal SIGNUM) to that process +- before it returns. +- +- The return value from `kill' is zero if the signal can be sent +- successfully. Otherwise, no signal is sent, and a value of `-1' is +- returned. If PID specifies sending a signal to several processes, +- `kill' succeeds if it can send the signal to at least one of them. +- There's no way you can tell which of the processes got the signal +- or whether all of them did. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EINVAL' +- The SIGNUM argument is an invalid or unsupported number. +- +- `EPERM' +- You do not have the privilege to send a signal to the process +- or any of the processes in the process group named by PID. +- +- `ESCRH' +- The PID argument does not refer to an existing process or +- group. +- +- - Function: int killpg (int PGID, int SIGNUM) +- This is similar to `kill', but sends signal SIGNUM to the process +- group PGID. This function is provided for compatibility with BSD; +- using `kill' to do this is more portable. +- +- As a simple example of `kill', the call `kill (getpid (), SIG)' has +-the same effect as `raise (SIG)'. +- +- +-File: libc.info, Node: Permission for kill, Next: Kill Example, Prev: Signaling Another Process, Up: Generating Signals +- +-Permission for using `kill' +---------------------------- +- +- There are restrictions that prevent you from using `kill' to send +-signals to any random process. These are intended to prevent antisocial +-behavior such as arbitrarily killing off processes belonging to another +-user. In typical use, `kill' is used to pass signals between parent, +-child, and sibling processes, and in these situations you normally do +-have permission to send signals. The only common exception is when you +-run a setuid program in a child process; if the program changes its +-real UID as well as its effective UID, you may not have permission to +-send a signal. The `su' program does this. +- +- Whether a process has permission to send a signal to another process +-is determined by the user IDs of the two processes. This concept is +-discussed in detail in *Note Process Persona::. +- +- Generally, for a process to be able to send a signal to another +-process, either the sending process must belong to a privileged user +-(like `root'), or the real or effective user ID of the sending process +-must match the real or effective user ID of the receiving process. If +-the receiving process has changed its effective user ID from the +-set-user-ID mode bit on its process image file, then the owner of the +-process image file is used in place of its current effective user ID. +-In some implementations, a parent process might be able to send signals +-to a child process even if the user ID's don't match, and other +-implementations might enforce other restrictions. +- +- The `SIGCONT' signal is a special case. It can be sent if the +-sender is part of the same session as the receiver, regardless of user +-IDs. +- +- +-File: libc.info, Node: Kill Example, Prev: Permission for kill, Up: Generating Signals +- +-Using `kill' for Communication +------------------------------- +- +- Here is a longer example showing how signals can be used for +-interprocess communication. This is what the `SIGUSR1' and `SIGUSR2' +-signals are provided for. Since these signals are fatal by default, +-the process that is supposed to receive them must trap them through +-`signal' or `sigaction'. +- +- In this example, a parent process forks a child process and then +-waits for the child to complete its initialization. The child process +-tells the parent when it is ready by sending it a `SIGUSR1' signal, +-using the `kill' function. +- +- #include +- #include +- #include +- #include +- +- /* When a `SIGUSR1' signal arrives, set this variable. */ +- volatile sig_atomic_t usr_interrupt = 0; +- +- void +- synch_signal (int sig) +- { +- usr_interrupt = 1; +- } +- +- /* The child process executes this function. */ +- void +- child_function (void) +- { +- /* Perform initialization. */ +- printf ("I'm here!!! My pid is %d.\n", (int) getpid ()); +- +- /* Let parent know you're done. */ +- kill (getppid (), SIGUSR1); +- +- /* Continue with execution. */ +- puts ("Bye, now...."); +- exit (0); +- } +- +- int +- main (void) +- { +- struct sigaction usr_action; +- sigset_t block_mask; +- pid_t child_id; +- +- /* Establish the signal handler. */ +- sigfillset (&block_mask); +- usr_action.sa_handler = synch_signal; +- usr_action.sa_mask = block_mask; +- usr_action.sa_flags = 0; +- sigaction (SIGUSR1, &usr_action, NULL); +- +- /* Create the child process. */ +- child_id = fork (); +- if (child_id == 0) +- child_function (); /* Does not return. */ +- /* Busy wait for the child to send a signal. */ +- while (!usr_interrupt) +- ; +- +- /* Now continue execution. */ +- puts ("That's all, folks!"); +- +- return 0; +- } +- +- This example uses a busy wait, which is bad, because it wastes CPU +-cycles that other programs could otherwise use. It is better to ask the +-system to wait until the signal arrives. See the example in *Note +-Waiting for a Signal::. +- +- +-File: libc.info, Node: Blocking Signals, Next: Waiting for a Signal, Prev: Generating Signals, Up: Signal Handling +- +-Blocking Signals +-================ +- +- Blocking a signal means telling the operating system to hold it and +-deliver it later. Generally, a program does not block signals +-indefinitely--it might as well ignore them by setting their actions to +-`SIG_IGN'. But it is useful to block signals briefly, to prevent them +-from interrupting sensitive operations. For instance: +- +- * You can use the `sigprocmask' function to block signals while you +- modify global variables that are also modified by the handlers for +- these signals. +- +- * You can set `sa_mask' in your `sigaction' call to block certain +- signals while a particular signal handler runs. This way, the +- signal handler can run without being interrupted itself by signals. +- +-* Menu: +- +-* Why Block:: The purpose of blocking signals. +-* Signal Sets:: How to specify which signals to +- block. +-* Process Signal Mask:: Blocking delivery of signals to your +- process during normal execution. +-* Testing for Delivery:: Blocking to Test for Delivery of +- a Signal. +-* Blocking for Handler:: Blocking additional signals while a +- handler is being run. +-* Checking for Pending Signals:: Checking for Pending Signals +-* Remembering a Signal:: How you can get almost the same +- effect as blocking a signal, by +- handling it and setting a flag +- to be tested later. +- +- +-File: libc.info, Node: Why Block, Next: Signal Sets, Up: Blocking Signals +- +-Why Blocking Signals is Useful +------------------------------- +- +- Temporary blocking of signals with `sigprocmask' gives you a way to +-prevent interrupts during critical parts of your code. If signals +-arrive in that part of the program, they are delivered later, after you +-unblock them. +- +- One example where this is useful is for sharing data between a signal +-handler and the rest of the program. If the type of the data is not +-`sig_atomic_t' (*note Atomic Data Access::.), then the signal handler +-could run when the rest of the program has only half finished reading +-or writing the data. This would lead to confusing consequences. +- +- To make the program reliable, you can prevent the signal handler from +-running while the rest of the program is examining or modifying that +-data--by blocking the appropriate signal around the parts of the +-program that touch the data. +- +- Blocking signals is also necessary when you want to perform a certain +-action only if a signal has not arrived. Suppose that the handler for +-the signal sets a flag of type `sig_atomic_t'; you would like to test +-the flag and perform the action if the flag is not set. This is +-unreliable. Suppose the signal is delivered immediately after you test +-the flag, but before the consequent action: then the program will +-perform the action even though the signal has arrived. +- +- The only way to test reliably for whether a signal has yet arrived +-is to test while the signal is blocked. +- +- +-File: libc.info, Node: Signal Sets, Next: Process Signal Mask, Prev: Why Block, Up: Blocking Signals +- +-Signal Sets +------------ +- +- All of the signal blocking functions use a data structure called a +-"signal set" to specify what signals are affected. Thus, every +-activity involves two stages: creating the signal set, and then passing +-it as an argument to a library function. +- +- These facilities are declared in the header file `signal.h'. +- +- - Data Type: sigset_t +- The `sigset_t' data type is used to represent a signal set. +- Internally, it may be implemented as either an integer or structure +- type. +- +- For portability, use only the functions described in this section +- to initialize, change, and retrieve information from `sigset_t' +- objects--don't try to manipulate them directly. +- +- There are two ways to initialize a signal set. You can initially +-specify it to be empty with `sigemptyset' and then add specified +-signals individually. Or you can specify it to be full with +-`sigfillset' and then delete specified signals individually. +- +- You must always initialize the signal set with one of these two +-functions before using it in any other way. Don't try to set all the +-signals explicitly because the `sigset_t' object might include some +-other information (like a version field) that needs to be initialized as +-well. (In addition, it's not wise to put into your program an +-assumption that the system has no signals aside from the ones you know +-about.) +- +- - Function: int sigemptyset (sigset_t *SET) +- This function initializes the signal set SET to exclude all of the +- defined signals. It always returns `0'. +- +- - Function: int sigfillset (sigset_t *SET) +- This function initializes the signal set SET to include all of the +- defined signals. Again, the return value is `0'. +- +- - Function: int sigaddset (sigset_t *SET, int SIGNUM) +- This function adds the signal SIGNUM to the signal set SET. All +- `sigaddset' does is modify SET; it does not block or unblock any +- signals. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error condition is defined for this function: +- +- `EINVAL' +- The SIGNUM argument doesn't specify a valid signal. +- +- - Function: int sigdelset (sigset_t *SET, int SIGNUM) +- This function removes the signal SIGNUM from the signal set SET. +- All `sigdelset' does is modify SET; it does not block or unblock +- any signals. The return value and error conditions are the same +- as for `sigaddset'. +- +- Finally, there is a function to test what signals are in a signal +-set: +- +- - Function: int sigismember (const sigset_t *SET, int SIGNUM) +- The `sigismember' function tests whether the signal SIGNUM is a +- member of the signal set SET. It returns `1' if the signal is in +- the set, `0' if not, and `-1' if there is an error. +- +- The following `errno' error condition is defined for this function: +- +- `EINVAL' +- The SIGNUM argument doesn't specify a valid signal. +- +- +-File: libc.info, Node: Process Signal Mask, Next: Testing for Delivery, Prev: Signal Sets, Up: Blocking Signals +- +-Process Signal Mask +-------------------- +- +- The collection of signals that are currently blocked is called the +-"signal mask". Each process has its own signal mask. When you create +-a new process (*note Creating a Process::.), it inherits its parent's +-mask. You can block or unblock signals with total flexibility by +-modifying the signal mask. +- +- The prototype for the `sigprocmask' function is in `signal.h'. +- +- - 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 +- #include +- +- void catch_stop (); +- +- void +- install_handler (void) +- { +- struct sigaction setup_action; +- sigset_t block_mask; +- +- sigemptyset (&block_mask); +- /* Block other terminal-generated signals while handler runs. */ +- sigaddset (&block_mask, SIGINT); +- sigaddset (&block_mask, SIGQUIT); +- setup_action.sa_handler = catch_stop; +- setup_action.sa_mask = block_mask; +- setup_action.sa_flags = 0; +- sigaction (SIGTSTP, &setup_action, NULL); +- } +- +- This is more reliable than blocking the other signals explicitly in +-the code for the handler. If you block signals explicitly in the +-handler, you can't avoid at least a short interval at the beginning of +-the handler where they are not yet blocked. +- +- You cannot remove signals from the process's current mask using this +-mechanism. However, you can make calls to `sigprocmask' within your +-handler to block or unblock signals as you wish. +- +- In any case, when the handler returns, the system restores the mask +-that was in place before the handler was entered. If any signals that +-become unblocked by this restoration are pending, the process will +-receive those signals immediately, before returning to the code that was +-interrupted. +- +- +-File: libc.info, Node: Checking for Pending Signals, Next: Remembering a Signal, Prev: Blocking for Handler, Up: Blocking Signals +- +-Checking for Pending Signals +----------------------------- +- +- You can find out which signals are pending at any time by calling +-`sigpending'. This function is declared in `signal.h'. +- +- - Function: int sigpending (sigset_t *SET) +- The `sigpending' function stores information about pending signals +- in SET. If there is a pending signal that is blocked from +- delivery, then that signal is a member of the returned set. (You +- can test whether a particular signal is a member of this set using +- `sigismember'; see *Note Signal Sets::.) +- +- The return value is `0' if successful, and `-1' on failure. +- +- Testing whether a signal is pending is not often useful. Testing +-when that signal is not blocked is almost certainly bad design. +- +- Here is an example. +- +- #include +- #include +- +- sigset_t base_mask, waiting_mask; +- +- sigemptyset (&base_mask); +- sigaddset (&base_mask, SIGINT); +- sigaddset (&base_mask, SIGTSTP); +- +- /* Block user interrupts while doing other processing. */ +- sigprocmask (SIG_SETMASK, &base_mask, NULL); +- ... +- +- /* After a while, check to see whether any signals are pending. */ +- sigpending (&waiting_mask); +- if (sigismember (&waiting_mask, SIGINT)) { +- /* User has tried to kill the process. */ +- } +- else if (sigismember (&waiting_mask, SIGTSTP)) { +- /* User has tried to stop the process. */ +- } +- +- Remember that if there is a particular signal pending for your +-process, additional signals of that same type that arrive in the +-meantime might be discarded. For example, if a `SIGINT' signal is +-pending when another `SIGINT' signal arrives, your program will +-probably only see one of them when you unblock this signal. +- +- *Portability Note:* The `sigpending' function is new in POSIX.1. +-Older systems have no equivalent facility. +- +diff -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 +- #include +- +- int +- main (int argc, char **argv) +- { +- int aflag = 0; +- int bflag = 0; +- char *cvalue = NULL; +- int index; +- int c; +- +- opterr = 0; +- +- while ((c = getopt (argc, argv, "abc:")) != -1) +- switch (c) +- { +- case 'a': +- aflag = 1; +- break; +- case 'b': +- bflag = 1; +- break; +- case 'c': +- cvalue = optarg; +- break; +- case '?': +- if (isprint (optopt)) +- fprintf (stderr, "Unknown option `-%c'.\n", optopt); +- else +- fprintf (stderr, +- "Unknown option character `\\x%x'.\n", +- optopt); +- return 1; +- default: +- abort (); +- } +- +- printf ("aflag = %d, bflag = %d, cvalue = %s\n", +- aflag, bflag, cvalue); +- +- for (index = optind; index < argc; index++) +- printf ("Non-option argument %s\n", argv[index]); +- return 0; +- } +- +- Here are some examples showing what this program prints with +-different combinations of arguments: +- +- % testopt +- aflag = 0, bflag = 0, cvalue = (null) +- +- % testopt -a -b +- aflag = 1, bflag = 1, cvalue = (null) +- +- % testopt -ab +- aflag = 1, bflag = 1, cvalue = (null) +- +- % testopt -c foo +- aflag = 0, bflag = 0, cvalue = foo +- +- % testopt -cfoo +- aflag = 0, bflag = 0, cvalue = foo +- +- % testopt arg1 +- aflag = 0, bflag = 0, cvalue = (null) +- Non-option argument arg1 +- +- % testopt -a arg1 +- aflag = 1, bflag = 0, cvalue = (null) +- Non-option argument arg1 +- +- % testopt -c foo arg1 +- aflag = 0, bflag = 0, cvalue = foo +- Non-option argument arg1 +- +- % testopt -a -- -b +- aflag = 1, bflag = 0, cvalue = (null) +- Non-option argument -b +- +- % testopt -a - +- aflag = 1, bflag = 0, cvalue = (null) +- Non-option argument - +- +- +-File: libc.info, Node: Getopt Long Options, Next: Getopt Long Option Example, Prev: Example of Getopt, Up: Getopt +- +-Parsing Long Options with `getopt_long' +---------------------------------------- +- +- To accept GNU-style long options as well as single-character options, +-use `getopt_long' instead of `getopt'. This function is declared in +-`getopt.h', not `unistd.h'. You should make every program accept long +-options if it uses any options, for this takes little extra work and +-helps beginners remember how to use the program. +- +- - Data Type: struct option +- This structure describes a single long option name for the sake of +- `getopt_long'. The argument LONGOPTS must be an array of these +- structures, one for each long option. Terminate the array with an +- element containing all zeros. +- +- The `struct option' structure has these fields: +- +- `const char *name' +- This field is the name of the option. It is a string. +- +- `int has_arg' +- This field says whether the option takes an argument. It is +- an integer, and there are three legitimate values: +- `no_argument', `required_argument' and `optional_argument'. +- +- `int *flag' +- `int val' +- These fields control how to report or act on the option when +- it occurs. +- +- If `flag' is a null pointer, then the `val' is a value which +- identifies this option. Often these values are chosen to +- uniquely identify particular long options. +- +- If `flag' is not a null pointer, it should be the address of +- an `int' variable which is the flag for this option. The +- value in `val' is the value to store in the flag to indicate +- that the option was seen. +- +- - Function: int getopt_long (int ARGC, char **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 +- #include +- #include +- +- /* Flag set by `--verbose'. */ +- static int verbose_flag; +- +- int +- main (argc, argv) +- int argc; +- char **argv; +- { +- int c; +- +- while (1) +- { +- static struct option long_options[] = +- { +- /* These options set a flag. */ +- {"verbose", 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 `' 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 `'. +- +- +-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 +- +- 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 +- +- const char *argp_program_version = +- "argp-ex2 1.0"; +- const char *argp_program_bug_address = +- ""; +- +- /* Program documentation. */ +- static char doc[] = +- "Argp example #2 -- a pretty minimal program using argp"; +- +- /* Our 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 +- +- const char *argp_program_version = +- "argp-ex3 1.0"; +- const char *argp_program_bug_address = +- ""; +- +- /* Program documentation. */ +- static char doc[] = +- "Argp example #3 -- a program with options and arguments using argp"; +- +- /* A description of the arguments we accept. */ +- static char args_doc[] = "ARG1 ARG2"; +- +- /* The options we understand. */ +- static struct argp_option options[] = { +- {"verbose", 'v', 0, 0, "Produce verbose output" }, +- {"quiet", 'q', 0, 0, "Don't produce any output" }, +- {"silent", 's', 0, OPTION_ALIAS }, +- {"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" }, +- { 0 } +- }; +- +- /* Used by `main' to communicate with `parse_opt'. */ +- struct arguments +- { +- char *args[2]; /* ARG1 & ARG2 */ +- int silent, verbose; +- char *output_file; +- }; +- +- /* Parse a single option. */ +- static error_t +- parse_opt (int key, char *arg, struct argp_state *state) +- { +- /* Get the INPUT argument from `argp_parse', which we +- know is a pointer to our arguments structure. */ +- struct arguments *arguments = state->input; +- +- switch (key) +- { +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- +- case ARGP_KEY_ARG: +- if (state->arg_num >= 2) +- /* Too many arguments. */ +- argp_usage (state); +- +- arguments->args[state->arg_num] = arg; +- +- break; +- +- case ARGP_KEY_END: +- if (state->arg_num < 2) +- /* Not enough arguments. */ +- argp_usage (state); +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- } +- return 0; +- } +- +- /* Our argp parser. */ +- static struct argp argp = { options, parse_opt, args_doc, doc }; +- +- int main (int argc, char **argv) +- { +- struct arguments arguments; +- +- /* Default values. */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- +- /* Parse our arguments; every option seen by `parse_opt' will +- be reflected in `arguments'. */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n" +- "VERBOSE = %s\nSILENT = %s\n", +- arguments.args[0], arguments.args[1], +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- +- exit (0); +- } +- +- +-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 +- #include +- #include +- +- const char *argp_program_version = +- "argp-ex4 1.0"; +- const char *argp_program_bug_address = +- ""; +- +- /* Program documentation. */ +- static char doc[] = +- "Argp example #4 -- a program with somewhat more complicated\ +- options\ +- \vThis part of the documentation comes *after* the options;\ +- note that the text is automatically filled, but it's possible\ +- to force a line-break, e.g.\n<-- here."; +- +- /* A description of the arguments we accept. */ +- static char args_doc[] = "ARG1 [STRING...]"; +- +- /* Keys for options without short-options. */ +- #define OPT_ABORT 1 /* -abort */ +- +- /* The options we understand. */ +- static struct argp_option options[] = { +- {"verbose", 'v', 0, 0, "Produce verbose output" }, +- {"quiet", 'q', 0, 0, "Don't produce any output" }, +- {"silent", 's', 0, OPTION_ALIAS }, +- {"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" }, +- +- {0,0,0,0, "The following options should be grouped together:" }, +- {"repeat", 'r', "COUNT", OPTION_ARG_OPTIONAL, +- "Repeat the output COUNT (default 10) times"}, +- {"abort", OPT_ABORT, 0, 0, "Abort before showing any output"}, +- +- { 0 } +- }; +- +- /* Used by `main' to communicate with `parse_opt'. */ +- struct arguments +- { +- char *arg1; /* ARG1 */ +- char **strings; /* [STRING...] */ +- int silent, verbose, abort; /* `-s', `-v', `--abort' */ +- char *output_file; /* FILE arg to `--output' */ +- int repeat_count; /* COUNT arg to `--repeat' */ +- }; +- +- /* Parse a single option. */ +- static error_t +- parse_opt (int key, char *arg, struct argp_state *state) +- { +- /* Get the `input' argument from `argp_parse', which we +- know is a pointer to our arguments structure. */ +- struct arguments *arguments = state->input; +- +- switch (key) +- { +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- case 'r': +- arguments->repeat_count = arg ? atoi (arg) : 10; +- break; +- case OPT_ABORT: +- arguments->abort = 1; +- break; +- +- case ARGP_KEY_NO_ARGS: +- argp_usage (state); +- +- case ARGP_KEY_ARG: +- /* Here we know that `state->arg_num == 0', since we +- force argument parsing to end before any more arguments can +- get here. */ +- arguments->arg1 = arg; +- +- /* Now we consume all the rest of the arguments. +- `state->next' is the index in `state->argv' of the +- next argument to be parsed, which is the first STRING +- we're interested in, so we can just use +- `&state->argv[state->next]' as the value for +- arguments->strings. +- +- *In addition*, by setting `state->next' to the end +- of the arguments, we can force argp to stop parsing here and +- return. */ +- arguments->strings = &state->argv[state->next]; +- state->next = state->argc; +- +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- } +- return 0; +- } +- +- /* Our argp parser. */ +- static struct argp argp = { options, parse_opt, args_doc, doc }; +- +- int main (int argc, char **argv) +- { +- int i, j; +- struct arguments arguments; +- +- /* Default values. */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- arguments.repeat_count = 1; +- arguments.abort = 0; +- +- /* Parse our arguments; every option seen by `parse_opt' will be +- reflected in `arguments'. */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- if (arguments.abort) +- error (10, 0, "ABORTED"); +- +- for (i = 0; i < arguments.repeat_count; i++) +- { +- printf ("ARG1 = %s\n", arguments.arg1); +- printf ("STRINGS = "); +- for (j = 0; arguments.strings[j]; j++) +- printf (j == 0 ? "%s" : ", %s", arguments.strings[j]); +- printf ("\n"); +- printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n", +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- } +- +- exit (0); +- } +- +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 +- #include +- +- int do_all; +- const char *type; +- int read_size; +- int write_size; +- int read_only; +- +- enum +- { +- RO_OPTION = 0, +- RW_OPTION, +- READ_SIZE_OPTION, +- WRITE_SIZE_OPTION +- }; +- +- 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 +- #include +- +- void +- bye (void) +- { +- puts ("Goodbye, cruel world...."); +- } +- +- int +- main (void) +- { +- atexit (bye); +- exit (EXIT_SUCCESS); +- } +- +-When this program is executed, it just prints the message and exits. +- +- +-File: libc.info, Node: Aborting a Program, Next: Termination Internals, Prev: Cleanups on Exit, Up: Program Termination +- +-Aborting a Program +------------------- +- +- You can abort your program using the `abort' function. The prototype +-for this function is in `stdlib.h'. +- +- - Function: void abort (void) +- The `abort' function causes abnormal program termination. This +- does not execute cleanup functions registered with `atexit' or +- `on_exit'. +- +- This function actually terminates the process by raising a +- `SIGABRT' signal, and your program can include a handler to +- intercept this signal; see *Note Signal Handling::. +- +- *Future Change Warning:* Proposed Federal censorship regulations may +-prohibit us from giving you information about the possibility of +-calling this function. We would be required to say that this is not an +-acceptable way of terminating a program. +- +- +-File: libc.info, Node: Termination Internals, Prev: Aborting a Program, Up: Program Termination +- +-Termination Internals +---------------------- +- +- The `_exit' function is the primitive used for process termination +-by `exit'. It is declared in the header file `unistd.h'. +- +- - Function: void _exit (int STATUS) +- The `_exit' function is the primitive for causing a process to +- terminate with status STATUS. Calling this function does not +- execute cleanup functions registered with `atexit' or `on_exit'. +- +- - Function: void _Exit (int STATUS) +- The `_Exit' function is the ISO C equivalent to `_exit'. The +- ISO C committee members were not sure whether the definitions of +- `_exit' and `_Exit' were compatible so they have not used the +- POSIX name. +- +- This function was introduced in ISO 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 +- #include +- #include +- #include +- #include +- +- /* Execute the command using this shell program. */ +- #define SHELL "/bin/sh" +- int +- my_system (const char *command) +- { +- int status; +- pid_t pid; +- +- pid = fork (); +- if (pid == 0) +- { +- /* This is the child process. Execute the shell command. */ +- execl (SHELL, SHELL, "-c", command, NULL); +- _exit (EXIT_FAILURE); +- } +- else if (pid < 0) +- /* The fork failed. Report failure. */ +- status = -1; +- else +- /* This is the parent process. Wait for the child to complete. */ +- if (waitpid (pid, &status, 0) != pid) +- status = -1; +- return status; +- } +- +- There are a couple of things you should pay attention to in this +-example. +- +- Remember that the first `argv' argument supplied to the program +-represents the name of the program being executed. That is why, in the +-call to `execl', `SHELL' is supplied once to name the program to +-execute and a second time to supply a value for `argv[0]'. +- +- The `execl' call in the child process doesn't return if it is +-successful. If it fails, you must do something to make the child +-process terminate. Just returning a bad status code with `return' +-would leave two processes running the original program. Instead, the +-right behavior is for the child process to report failure to its parent +-process. +- +- Call `_exit' to accomplish this. The reason for using `_exit' +-instead of `exit' is to avoid flushing fully buffered streams such as +-`stdout'. The buffers of these streams probably contain data that was +-copied from the parent process by the `fork', data that will be output +-eventually by the parent process. Calling `exit' in the child would +-output the data twice. *Note Termination Internals::. +- +- +-File: libc.info, Node: Job Control, Next: Name Service Switch, Prev: Processes, Up: Top +- +-Job Control +-*********** +- +- "Job control" refers to the protocol for allowing a user to move +-between multiple "process groups" (or "jobs") within a single "login +-session". The job control facilities are set up so that appropriate +-behavior for most programs happens automatically and they need not do +-anything special about job control. So you can probably ignore the +-material in this chapter unless you are writing a shell or login +-program. +- +- You need to be familiar with concepts relating to process creation +-(*note Process Creation Concepts::.) and signal handling (*note Signal +-Handling::.) in order to understand this material presented in this +-chapter. +- +-* Menu: +- +-* Concepts of Job Control:: Jobs can be controlled by a shell. +-* Job Control is Optional:: Not all POSIX systems support job control. +-* Controlling Terminal:: How a process gets its controlling terminal. +-* Access to the Terminal:: How processes share the controlling terminal. +-* Orphaned Process Groups:: Jobs left after the user logs out. +-* Implementing a Shell:: What a shell must do to implement job control. +-* Functions for Job Control:: Functions to control process groups. +- +- +-File: libc.info, Node: Concepts of Job Control, Next: Job Control is Optional, Up: Job Control +- +-Concepts of Job Control +-======================= +- +- The fundamental purpose of an interactive shell is to read commands +-from the user's terminal and create processes to execute the programs +-specified by those commands. It can do this using the `fork' (*note +-Creating a Process::.) and `exec' (*note Executing a File::.) functions. +- +- A single command may run just one process--but often one command uses +-several processes. If you use the `|' operator in a shell command, you +-explicitly request several programs in their own processes. But even +-if you run just one program, it can use multiple processes internally. +-For example, a single compilation command such as `cc -c foo.c' +-typically uses four processes (though normally only two at any given +-time). If you run `make', its job is to run other programs in separate +-processes. +- +- The processes belonging to a single command are called a "process +-group" or "job". This is so that you can operate on all of them at +-once. For example, typing `C-c' sends the signal `SIGINT' to terminate +-all the processes in the foreground process group. +- +- A "session" is a larger group of processes. Normally all the +-processes that stem from a single login belong to the same session. +- +- Every process belongs to a process group. When a process is +-created, it becomes a member of the same process group and session as +-its parent process. You can put it in another process group using the +-`setpgid' function, provided the process group belongs to the same +-session. +- +- The only way to put a process in a different session is to make it +-the initial process of a new session, or a "session leader", using the +-`setsid' function. This also puts the session leader into a new +-process group, and you can't move it out of that process group again. +- +- Usually, new sessions are created by the system login program, and +-the session leader is the process running the user's login shell. +- +- A shell that supports job control must arrange to control which job +-can use the terminal at any time. Otherwise there might be multiple +-jobs trying to read from the terminal at once, and confusion about which +-process should receive the input typed by the user. To prevent this, +-the shell must cooperate with the terminal driver using the protocol +-described in this chapter. +- +- The shell can give unlimited access to the controlling terminal to +-only one process group at a time. This is called the "foreground job" +-on that controlling terminal. Other process groups managed by the shell +-that are executing without such access to the terminal are called +-"background jobs". +- +- If a background job needs to read from its controlling terminal, it +-is "stopped" by the terminal driver; if the `TOSTOP' mode is set, +-likewise for writing. The user can stop a foreground job by typing the +-SUSP character (*note Special Characters::.) and a program can stop any +-job by sending it a `SIGSTOP' signal. It's the responsibility of the +-shell to notice when jobs stop, to notify the user about them, and to +-provide mechanisms for allowing the user to interactively continue +-stopped jobs and switch jobs between foreground and background. +- +- *Note Access to the Terminal::, for more information about I/O to the +-controlling terminal, +- +- +-File: libc.info, Node: Job Control is Optional, Next: Controlling Terminal, Prev: Concepts of Job Control, Up: Job Control +- +-Job Control is Optional +-======================= +- +- Not all operating systems support job control. The GNU system does +-support job control, but if you are using the GNU library on some other +-system, that system may not support job control itself. +- +- You can use the `_POSIX_JOB_CONTROL' macro to test at compile-time +-whether the system supports job control. *Note System Options::. +- +- If job control is not supported, then there can be only one process +-group per session, which behaves as if it were always in the foreground. +-The functions for creating additional process groups simply fail with +-the error code `ENOSYS'. +- +- The macros naming the various job control signals (*note Job Control +-Signals::.) are defined even if job control is not supported. However, +-the system never generates these signals, and attempts to send a job +-control signal or examine or specify their actions report errors or do +-nothing. +- +- +-File: libc.info, Node: Controlling Terminal, Next: Access to the Terminal, Prev: Job Control is Optional, Up: Job Control +- +-Controlling Terminal of a Process +-================================= +- +- One of the attributes of a process is its controlling terminal. +-Child processes created with `fork' inherit the controlling terminal +-from their parent process. In this way, all the processes in a session +-inherit the controlling terminal from the session leader. A session +-leader that has control of a terminal is called the "controlling +-process" of that terminal. +- +- You generally do not need to worry about the exact mechanism used to +-allocate a controlling terminal to a session, since it is done for you +-by the system when you log in. +- +- An individual process disconnects from its controlling terminal when +-it calls `setsid' to become the leader of a new session. *Note Process +-Group Functions::. +- +- +-File: libc.info, Node: Access to the Terminal, Next: Orphaned Process Groups, Prev: Controlling Terminal, Up: Job Control +- +-Access to the Controlling Terminal +-================================== +- +- Processes in the foreground job of a controlling terminal have +-unrestricted access to that terminal; background processes do not. This +-section describes in more detail what happens when a process in a +-background job tries to access its controlling terminal. +- +- When a process in a background job tries to read from its controlling +-terminal, the process group is usually sent a `SIGTTIN' signal. This +-normally causes all of the processes in that group to stop (unless they +-handle the signal and don't stop themselves). However, if the reading +-process is ignoring or blocking this signal, then `read' fails with an +-`EIO' error instead. +- +- Similarly, when a process in a background job tries to write to its +-controlling terminal, the default behavior is to send a `SIGTTOU' +-signal to the process group. However, the behavior is modified by the +-`TOSTOP' bit of the local modes flags (*note Local Modes::.). If this +-bit is not set (which is the default), then writing to the controlling +-terminal is always permitted without sending a signal. Writing is also +-permitted if the `SIGTTOU' signal is being ignored or blocked by the +-writing process. +- +- Most other terminal operations that a program can do are treated as +-reading or as writing. (The description of each operation should say +-which.) +- +- For more information about the primitive `read' and `write' +-functions, see *Note I/O Primitives::. +- +- +-File: libc.info, Node: Orphaned Process Groups, Next: Implementing a Shell, Prev: Access to the Terminal, Up: Job Control +- +-Orphaned Process Groups +-======================= +- +- When a controlling process terminates, its terminal becomes free and +-a new session can be established on it. (In fact, another user could +-log in on the terminal.) This could cause a problem if any processes +-from the old session are still trying to use that terminal. +- +- To prevent problems, process groups that continue running even after +-the session leader has terminated are marked as "orphaned process +-groups". +- +- When a process group becomes an orphan, its processes are sent a +-`SIGHUP' signal. Ordinarily, this causes the processes to terminate. +-However, if a program ignores this signal or establishes a handler for +-it (*note Signal Handling::.), it can continue running as in the orphan +-process group even after its controlling process terminates; but it +-still cannot access the terminal any more. +- +- +-File: libc.info, Node: Implementing a Shell, Next: Functions for Job Control, Prev: Orphaned Process Groups, Up: Job Control +- +-Implementing a Job Control Shell +-================================ +- +- This section describes what a shell must do to implement job +-control, by presenting an extensive sample program to illustrate the +-concepts involved. +- +-* Menu: +- +-* Data Structures:: Introduction to the sample shell. +-* Initializing the Shell:: What the shell must do to take +- responsibility for job control. +-* Launching Jobs:: Creating jobs to execute commands. +-* Foreground and Background:: Putting a job in foreground of background. +-* Stopped and Terminated Jobs:: Reporting job status. +-* Continuing Stopped Jobs:: How to continue a stopped job in +- the foreground or background. +-* Missing Pieces:: Other parts of the shell. +- +- +-File: libc.info, Node: Data Structures, Next: Initializing the Shell, Up: Implementing a Shell +- +-Data Structures for the Shell +------------------------------ +- +- All of the program examples included in this chapter are part of a +-simple shell program. This section presents data structures and +-utility functions which are used throughout the example. +- +- The sample shell deals mainly with two data structures. The `job' +-type contains information about a job, which is a set of subprocesses +-linked together with pipes. The `process' type holds information about +-a single subprocess. Here are the relevant data structure declarations: +- +- /* A process is a single process. */ +- typedef struct process +- { +- struct process *next; /* next process in pipeline */ +- char **argv; /* for exec */ +- pid_t pid; /* process ID */ +- char completed; /* true if process has completed */ +- char stopped; /* true if process has stopped */ +- int status; /* reported status value */ +- } process; +- +- /* A job is a pipeline of processes. */ +- typedef struct job +- { +- struct job *next; /* next active job */ +- char *command; /* command line, used for messages */ +- process *first_process; /* list of processes in this job */ +- pid_t pgid; /* process group ID */ +- char notified; /* true if user told about stopped job */ +- struct termios tmodes; /* saved terminal modes */ +- int stdin, stdout, stderr; /* standard i/o channels */ +- } job; +- +- /* The active jobs are linked into a list. This is its head. */ +- job *first_job = NULL; +- +- Here are some utility functions that are used for operating on `job' +-objects. +- +- /* Find the active job with the indicated PGID. */ +- job * +- find_job (pid_t pgid) +- { +- job *j; +- +- for (j = first_job; j; j = j->next) +- if (j->pgid == pgid) +- return j; +- return NULL; +- } +- +- /* Return true if all processes in the job have stopped or completed. */ +- int +- job_is_stopped (job *j) +- { +- process *p; +- +- for (p = j->first_process; p; p = p->next) +- if (!p->completed && !p->stopped) +- return 0; +- return 1; +- } +- +- /* Return true if all processes in the job have completed. */ +- int +- job_is_completed (job *j) +- { +- process *p; +- +- for (p = j->first_process; p; p = p->next) +- if (!p->completed) +- return 0; +- return 1; +- } +- +- +-File: libc.info, Node: Initializing the Shell, Next: Launching Jobs, Prev: Data Structures, Up: Implementing a Shell +- +-Initializing the Shell +----------------------- +- +- When a shell program that normally performs job control is started, +-it has to be careful in case it has been invoked from another shell +-that is already doing its own job control. +- +- A subshell that runs interactively has to ensure that it has been +-placed in the foreground by its parent shell before it can enable job +-control itself. It does this by getting its initial process group ID +-with the `getpgrp' function, and comparing it to the process group ID +-of the current foreground job associated with its controlling terminal +-(which can be retrieved using the `tcgetpgrp' function). +- +- If the subshell is not running as a foreground job, it must stop +-itself by sending a `SIGTTIN' signal to its own process group. It may +-not arbitrarily put itself into the foreground; it must wait for the +-user to tell the parent shell to do this. If the subshell is continued +-again, it should repeat the check and stop itself again if it is still +-not in the foreground. +- +- Once the subshell has been placed into the foreground by its parent +-shell, it can enable its own job control. It does this by calling +-`setpgid' to put itself into its own process group, and then calling +-`tcsetpgrp' to place this process group into the foreground. +- +- When a shell enables job control, it should set itself to ignore all +-the job control stop signals so that it doesn't accidentally stop +-itself. You can do this by setting the action for all the stop signals +-to `SIG_IGN'. +- +- A subshell that runs non-interactively cannot and should not support +-job control. It must leave all processes it creates in the same process +-group as the shell itself; this allows the non-interactive shell and its +-child processes to be treated as a single job by the parent shell. This +-is easy to do--just don't use any of the job control primitives--but +-you must remember to make the shell do it. +- +- Here is the initialization code for the sample shell that shows how +-to do all of this. +- +- /* Keep track of attributes of the shell. */ +- +- #include +- #include +- #include +- +- pid_t shell_pgid; +- struct termios shell_tmodes; +- int shell_terminal; +- int shell_is_interactive; +- +- +- /* Make sure the shell is running interactively as the foreground job +- before proceeding. */ +- +- void +- init_shell () +- { +- +- /* See if we are running interactively. */ +- shell_terminal = STDIN_FILENO; +- shell_is_interactive = isatty (shell_terminal); +- +- if (shell_is_interactive) +- { +- /* Loop until we are in the foreground. */ +- while (tcgetpgrp (shell_terminal) != (shell_pgid = getpgrp ())) +- kill (- shell_pgid, SIGTTIN); +- +- /* Ignore interactive and job-control signals. */ +- signal (SIGINT, SIG_IGN); +- signal (SIGQUIT, SIG_IGN); +- signal (SIGTSTP, SIG_IGN); +- signal (SIGTTIN, SIG_IGN); +- signal (SIGTTOU, SIG_IGN); +- signal (SIGCHLD, SIG_IGN); +- +- /* Put ourselves in our own process group. */ +- shell_pgid = getpid (); +- if (setpgid (shell_pgid, shell_pgid) < 0) +- { +- perror ("Couldn't put the shell in its own process group"); +- exit (1); +- } +- +- /* Grab control of the terminal. */ +- tcsetpgrp (shell_terminal, shell_pgid); +- +- /* Save default terminal attributes for shell. */ +- tcgetattr (shell_terminal, &shell_tmodes); +- } +- } +- +- +-File: libc.info, Node: Launching Jobs, Next: Foreground and Background, Prev: Initializing the Shell, Up: Implementing a Shell +- +-Launching Jobs +--------------- +- +- Once the shell has taken responsibility for performing job control on +-its controlling terminal, it can launch jobs in response to commands +-typed by the user. +- +- To create the processes in a process group, you use the same `fork' +-and `exec' functions described in *Note Process Creation Concepts::. +-Since there are multiple child processes involved, though, things are a +-little more complicated and you must be careful to do things in the +-right order. Otherwise, nasty race conditions can result. +- +- You have two choices for how to structure the tree of parent-child +-relationships among the processes. You can either make all the +-processes in the process group be children of the shell process, or you +-can make one process in group be the ancestor of all the other processes +-in that group. The sample shell program presented in this chapter uses +-the first approach because it makes bookkeeping somewhat simpler. +- +- As each process is forked, it should put itself in the new process +-group by calling `setpgid'; see *Note Process Group Functions::. The +-first process in the new group becomes its "process group leader", and +-its process ID becomes the "process group ID" for the group. +- +- The shell should also call `setpgid' to put each of its child +-processes into the new process group. This is because there is a +-potential timing problem: each child process must be put in the process +-group before it begins executing a new program, and the shell depends on +-having all the child processes in the group before it continues +-executing. If both the child processes and the shell call `setpgid', +-this ensures that the right things happen no matter which process gets +-to it first. +- +- If the job is being launched as a foreground job, the new process +-group also needs to be put into the foreground on the controlling +-terminal using `tcsetpgrp'. Again, this should be done by the shell as +-well as by each of its child processes, to avoid race conditions. +- +- The next thing each child process should do is to reset its signal +-actions. +- +- During initialization, the shell process set itself to ignore job +-control signals; see *Note Initializing the Shell::. As a result, any +-child processes it creates also ignore these signals by inheritance. +-This is definitely undesirable, so each child process should explicitly +-set the actions for these signals back to `SIG_DFL' just after it is +-forked. +- +- Since shells follow this convention, applications can assume that +-they inherit the correct handling of these signals from the parent +-process. But every application has a responsibility not to mess up the +-handling of stop signals. Applications that disable the normal +-interpretation of the SUSP character should provide some other +-mechanism for the user to stop the job. When the user invokes this +-mechanism, the program should send a `SIGTSTP' signal to the process +-group of the process, not just to the process itself. *Note Signaling +-Another Process::. +- +- Finally, each child process should call `exec' in the normal way. +-This is also the point at which redirection of the standard input and +-output channels should be handled. *Note Duplicating Descriptors::, +-for an explanation of how to do this. +- +- Here is the function from the sample shell program that is +-responsible for launching a program. The function is executed by each +-child process immediately after it has been forked by the shell, and +-never returns. +- +- void +- launch_process (process *p, pid_t pgid, +- int infile, int outfile, int errfile, +- int foreground) +- { +- pid_t pid; +- +- if (shell_is_interactive) +- { +- /* Put the process into the process group and give the process group +- the terminal, if appropriate. +- This has to be done both by the shell and in the individual +- child processes because of potential race conditions. */ +- pid = getpid (); +- if (pgid == 0) pgid = pid; +- setpgid (pid, pgid); +- if (foreground) +- tcsetpgrp (shell_terminal, pgid); +- +- /* Set the handling for job control signals back to the default. */ +- signal (SIGINT, SIG_DFL); +- signal (SIGQUIT, SIG_DFL); +- signal (SIGTSTP, SIG_DFL); +- signal (SIGTTIN, SIG_DFL); +- signal (SIGTTOU, SIG_DFL); +- signal (SIGCHLD, SIG_DFL); +- } +- +- /* Set the standard input/output channels of the new process. */ +- if (infile != STDIN_FILENO) +- { +- dup2 (infile, STDIN_FILENO); +- close (infile); +- } +- if (outfile != STDOUT_FILENO) +- { +- dup2 (outfile, STDOUT_FILENO); +- close (outfile); +- } +- if (errfile != STDERR_FILENO) +- { +- dup2 (errfile, STDERR_FILENO); +- close (errfile); +- } +- +- /* Exec the new process. Make sure we exit. */ +- execvp (p->argv[0], p->argv); +- perror ("execvp"); +- exit (1); +- } +- +- If the shell is not running interactively, this function does not do +-anything with process groups or signals. Remember that a shell not +-performing job control must keep all of its subprocesses in the same +-process group as the shell itself. +- +- Next, here is the function that actually launches a complete job. +-After creating the child processes, this function calls some other +-functions to put the newly created job into the foreground or +-background; these are discussed in *Note Foreground and Background::. +- +- void +- launch_job (job *j, int foreground) +- { +- process *p; +- pid_t pid; +- int mypipe[2], infile, outfile; +- +- infile = j->stdin; +- for (p = j->first_process; p; p = p->next) +- { +- /* Set up pipes, if necessary. */ +- if (p->next) +- { +- if (pipe (mypipe) < 0) +- { +- perror ("pipe"); +- exit (1); +- } +- outfile = mypipe[1]; +- } +- else +- outfile = j->stdout; +- +- /* Fork the child processes. */ +- pid = fork (); +- if (pid == 0) +- /* This is the child process. */ +- launch_process (p, j->pgid, infile, +- outfile, j->stderr, foreground); +- else if (pid < 0) +- { +- /* The fork failed. */ +- perror ("fork"); +- exit (1); +- } +- else +- { +- /* This is the parent process. */ +- p->pid = pid; +- if (shell_is_interactive) +- { +- if (!j->pgid) +- j->pgid = pid; +- setpgid (pid, j->pgid); +- } +- } +- +- /* Clean up after pipes. */ +- if (infile != j->stdin) +- close (infile); +- if (outfile != j->stdout) +- close (outfile); +- infile = mypipe[0]; +- } +- +- format_job_info (j, "launched"); +- +- if (!shell_is_interactive) +- wait_for_job (j); +- else if (foreground) +- put_job_in_foreground (j, 0); +- else +- put_job_in_background (j, 0); +- } +- +- +-File: libc.info, Node: Foreground and Background, Next: Stopped and Terminated Jobs, Prev: Launching Jobs, Up: Implementing a Shell +- +-Foreground and Background +-------------------------- +- +- Now let's consider what actions must be taken by the shell when it +-launches a job into the foreground, and how this differs from what must +-be done when a background job is launched. +- +- When a foreground job is launched, the shell must first give it +-access to the controlling terminal by calling `tcsetpgrp'. Then, the +-shell should wait for processes in that process group to terminate or +-stop. This is discussed in more detail in *Note Stopped and Terminated +-Jobs::. +- +- When all of the processes in the group have either completed or +-stopped, the shell should regain control of the terminal for its own +-process group by calling `tcsetpgrp' again. Since stop signals caused +-by I/O from a background process or a SUSP character typed by the user +-are sent to the process group, normally all the processes in the job +-stop together. +- +- The foreground job may have left the terminal in a strange state, so +-the shell should restore its own saved terminal modes before +-continuing. In case the job is merely 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 +- #include +- #include +- #include +- +- +- /* Remember the effective and real UIDs. */ +- +- static uid_t euid, ruid; +- +- +- /* Restore the effective UID to its original value. */ +- +- void +- do_setuid (void) +- { +- int status; +- +- #ifdef _POSIX_SAVED_IDS +- status = seteuid (euid); +- #else +- status = setreuid (ruid, euid); +- #endif +- if (status < 0) { +- fprintf (stderr, "Couldn't set uid.\n"); +- exit (status); +- } +- } +- /* Set the effective UID to the real UID. */ +- +- void +- undo_setuid (void) +- { +- int status; +- +- #ifdef _POSIX_SAVED_IDS +- status = seteuid (ruid); +- #else +- status = setreuid (euid, ruid); +- #endif +- if (status < 0) { +- fprintf (stderr, "Couldn't set uid.\n"); +- exit (status); +- } +- } +- +- /* Main program. */ +- +- int +- main (void) +- { +- /* Remember the real and effective user IDs. */ +- ruid = getuid (); +- euid = geteuid (); +- undo_setuid (); +- +- /* Do the game and record the score. */ +- ... +- } +- +- Notice how the first thing the `main' function does is to set the +-effective user ID back to the real user ID. This is so that any other +-file accesses that are performed while the user is playing the game use +-the real user ID for determining permissions. Only when the program +-needs to open the scores file does it switch back to the file user ID, +-like this: +- +- /* Record the score. */ +- +- int +- record_score (int score) +- { +- FILE *stream; +- char *myname; +- +- /* Open the scores file. */ +- do_setuid (); +- stream = fopen (SCORES_FILE, "a"); +- undo_setuid (); +- /* Write the score to the file. */ +- if (stream) +- { +- myname = cuserid (NULL); +- if (score < 0) +- fprintf (stream, "%10s: Couldn't lift the caber.\n", myname); +- else +- fprintf (stream, "%10s: %d feet.\n", myname, score); +- fclose (stream); +- return 0; +- } +- else +- return -1; +- } +- +- +-File: libc.info, Node: Tips for Setuid, Next: Who Logged In, Prev: Setuid Program Example, Up: Users and Groups +- +-Tips for Writing Setuid Programs +-================================ +- +- It is easy for setuid programs to give the user access that isn't +-intended--in fact, if you want to avoid this, you need to be careful. +-Here are some guidelines for preventing unintended access and +-minimizing its consequences when it does occur: +- +- * Don't have `setuid' programs with privileged user IDs such as +- `root' unless it is absolutely necessary. If the resource is +- specific to your particular program, it's better to define a new, +- nonprivileged user ID or group ID just to manage that resource. +- It's better if you can write your program to use a special group +- than a special user. +- +- * Be cautious about using the `exec' functions in combination with +- changing the effective user ID. Don't let users of your program +- execute arbitrary programs under a changed user ID. Executing a +- shell is especially bad news. Less obviously, the `execlp' and +- `execvp' functions are a potential risk (since the program they +- execute depends on the user's `PATH' environment variable). +- +- If you must `exec' another program under a changed ID, specify an +- absolute file name (*note File Name Resolution::.) for the +- executable, and make sure that the protections on that executable +- and *all* containing directories are such that ordinary users +- cannot replace it with some other program. +- +- You should also check the arguments passed to the program to make +- sure they do not have unexpected effects. Likewise, you should +- examine the environment variables. Decide which arguments and +- variables are safe, and reject all others. +- +- You should never use `system' in a privileged program, because it +- invokes a shell. +- +- * Only use the user ID controlling the resource in the part of the +- program that actually uses that resource. When you're finished +- with it, restore the effective user ID back to the actual user's +- user ID. *Note Enable/Disable Setuid::. +- +- * If the `setuid' part of your program needs to access other files +- besides the controlled resource, it should verify that the real +- user would ordinarily have permission to access those files. You +- can use the `access' function (*note Access Permission::.) to +- check this; it uses the real user and group IDs, rather than the +- effective IDs. +- +- +-File: libc.info, Node: Who Logged In, Next: User Accounting Database, Prev: Tips for Setuid, Up: Users and Groups +- +-Identifying Who Logged In +-========================= +- +- You can use the functions listed in this section to determine the +-login name of the user who is running a process, and the name of the +-user who logged in the current session. See also the function `getuid' +-and friends (*note Reading Persona::.). How this information is +-collected by the system and how to control/add/remove information from +-the background storage is described in *Note User Accounting Database::. +- +- The `getlogin' function is declared in `unistd.h', while `cuserid' +-and `L_cuserid' are declared in `stdio.h'. +- +- - Function: char * getlogin (void) +- The `getlogin' function returns a pointer to a string containing +- the name of the user logged in on the controlling terminal of the +- process, or a null pointer if this information cannot be +- determined. The string is statically allocated and might be +- overwritten on subsequent calls to this function or to `cuserid'. +- +- - Function: char * cuserid (char *STRING) +- The `cuserid' function returns a pointer to a string containing a +- user name associated with the effective ID of the process. If +- STRING is not a null pointer, it should be an array that can hold +- at least `L_cuserid' characters; the string is returned in this +- array. Otherwise, a pointer to a string in a static area is +- returned. This string is statically allocated and might be +- overwritten on subsequent calls to this function or to `getlogin'. +- +- The use of this function is deprecated since it is marked to be +- withdrawn in XPG4.2 and has already been removed from newer +- revisions of POSIX.1. +- +- - Macro: int L_cuserid +- An integer constant that indicates how long an array you might +- need to store a user name. +- +- These functions let your program identify positively the user who is +-running or the user who logged in this session. (These can differ when +-setuid programs are involved; see *Note Process Persona::.) The user +-cannot do anything to fool these functions. +- +- For most purposes, it is more useful to use the environment variable +-`LOGNAME' to find out who the user is. This is more flexible precisely +-because the user can set `LOGNAME' arbitrarily. *Note Standard +-Environment::. +- +- +-File: libc.info, Node: User Accounting Database, Next: User Database, Prev: Who Logged In, Up: Users and Groups +- +-The User Accounting Database +-============================ +- +- Most Unix-like operating systems keep track of logged in users by +-maintaining a user accounting database. This user accounting database +-stores for each terminal, who has logged on, at what time, the process +-ID of the user's login shell, etc., etc., but also stores information +-about the run level of the system, the time of the last system reboot, +-and possibly more. +- +- The user accounting database typically lives in `/etc/utmp', +-`/var/adm/utmp' or `/var/run/utmp'. However, these files should +-*never* be accessed directly. For reading information from and writing +-information to the user accounting database, the functions described in +-this section should be used. +- +-* Menu: +- +-* Manipulating the Database:: Scanning and modifying the user +- accounting database. +-* XPG Functions:: A standardized way for doing the same thing. +-* Logging In and Out:: Functions from BSD that modify the user +- accounting database. +- +- +-File: libc.info, Node: Manipulating the Database, Next: XPG Functions, Up: User Accounting Database +- +-Manipulating the User Accounting Database +------------------------------------------ +- +- These functions and the corresponding data structures are declared in +-the header file `utmp.h'. +- +- - Data Type: struct exit_status +- The `exit_status' data structure is used to hold information about +- the exit status of processes marked as `DEAD_PROCESS' in the user +- accounting database. +- +- `short int e_termination' +- The exit status of the process. +- +- `short int e_exit' +- The exit status of the process. +- +- - Data Type: struct utmp +- The `utmp' data structure is used to hold information about entries +- in the user accounting database. On the GNU system it has the +- following members: +- +- `short int ut_type' +- Specifies the type of login; one of `EMPTY', `RUN_LVL', +- `BOOT_TIME', `OLD_TIME', `NEW_TIME', `INIT_PROCESS', +- `LOGIN_PROCESS', `USER_PROCESS', `DEAD_PROCESS' or +- `ACCOUNTING'. +- +- `pid_t ut_pid' +- The process ID number of the login process. +- +- `char ut_line[]' +- The device name of the tty (without `/dev/'). +- +- `char ut_id[]' +- The inittab ID of the process. +- +- `char ut_user[]' +- The user's login name. +- +- `char ut_host[]' +- The name of the host from which the user logged in. +- +- `struct exit_status ut_exit' +- The exit status of a process marked as `DEAD_PROCESS'. +- +- `long ut_session' +- The Session ID, used for windowing. +- +- `struct timeval ut_tv' +- Time the entry was made. For entries of type `OLD_TIME' this +- is the time when the system clock changed, and for entries of +- type `NEW_TIME' this is the time the system clock was set to. +- +- `int32_t ut_addr_v6[4]' +- The Internet address of a remote host. +- +- The `ut_type', `ut_pid', `ut_id', `ut_tv', and `ut_host' fields are +-not available on all systems. Portable applications therefore should +-be prepared for these situations. To help doing this the `utmp.h' +-header provides macros `_HAVE_UT_TYPE', `_HAVE_UT_PID', `_HAVE_UT_ID', +-`_HAVE_UT_TV', and `_HAVE_UT_HOST' if the respective field is +-available. The programmer can handle the situations by using `#ifdef' +-in the program code. +- +- The following macros are defined for use as values for the `ut_type' +-member of the `utmp' structure. The values are integer constants. +- +-`EMPTY' +- This macro is used to indicate that the entry contains no valid +- user accounting information. +- +-`RUN_LVL' +- This macro is used to identify the systems runlevel. +- +-`BOOT_TIME' +- This macro is used to identify the time of system boot. +- +-`OLD_TIME' +- This macro is used to identify the time when the system clock +- changed. +- +-`NEW_TIME' +- This macro is used to identify the time after the system changed. +- +-`INIT_PROCESS' +- This macro is used to identify a process spawned by the init +- process. +- +-`LOGIN_PROCESS' +- This macro is used to identify the session leader of a logged in +- user. +- +-`USER_PROCESS' +- This macro is used to identify a user process. +- +-`DEAD_PROCESS' +- This macro is used to identify a terminated process. +- +-`ACCOUNTING' +- ??? +- +- The size of the `ut_line', `ut_id', `ut_user' and `ut_host' arrays +-can be found using the `sizeof' operator. +- +- Many older systems have, instead of an `ut_tv' member, an `ut_time' +-member, usually of type `time_t', for representing the time associated +-with the entry. Therefore, for backwards compatibility only, `utmp.h' +-defines `ut_time' as an alias for `ut_tv.tv_sec'. +- +- - Function: void setutent (void) +- This function opens the user accounting database to begin scanning +- it. You can then call `getutent', `getutid' or `getutline' to +- read entries and `pututline' to write entries. +- +- If the database is already open, it resets the input to the +- beginning of the database. +- +- - Function: struct utmp * getutent (void) +- The `getutent' function reads the next entry from the user +- accounting database. It returns a pointer to the entry, which is +- statically allocated and may be overwritten by subsequent calls to +- `getutent'. You must copy the contents of the structure if you +- wish to save the information or you can use the `getutent_r' +- function which stores the data in a user-provided buffer. +- +- A null pointer is returned in case no further entry is available. +- +- - Function: void endutent (void) +- This function closes the user accounting database. +- +- - Function: struct utmp * getutid (const struct utmp *ID) +- This function searches forward from the current point in the +- database for an entry that matches ID. If the `ut_type' member of +- the ID structure is one of `RUN_LVL', `BOOT_TIME', `OLD_TIME' or +- `NEW_TIME' the entries match if the `ut_type' members are +- identical. If the `ut_type' member of the ID structure is +- `INIT_PROCESS', `LOGIN_PROCESS', `USER_PROCESS' or `DEAD_PROCESS', +- the entries match if the `ut_type' member of the entry read from +- the database is one of these four, and the `ut_id' members match. +- However if the `ut_id' member of either the ID structure or the +- entry read from the database is empty it checks if the `ut_line' +- members match instead. If a matching entry is found, `getutid' +- returns a pointer to the entry, which is statically allocated, and +- may be overwritten by a subsequent call to `getutent', `getutid' +- or `getutline'. You must copy the contents of the structure if +- you wish to save the information. +- +- A null pointer is returned in case the end of the database is +- reached without a match. +- +- The `getutid' function may cache the last read entry. Therefore, +- if you are using `getutid' to search for multiple occurrences, it +- is necessary to zero out the static data after each call. +- Otherwise `getutid' could just return a pointer to the same entry +- over and over again. +- +- - Function: struct utmp * getutline (const struct utmp *LINE) +- This function searches forward from the current point in the +- database until it finds an entry whose `ut_type' value is +- `LOGIN_PROCESS' or `USER_PROCESS', and whose `ut_line' member +- matches the `ut_line' member of the LINE structure. If it finds +- such an entry, it returns a pointer to the entry which is +- statically allocated, and may be overwritten by a subsequent call +- to `getutent', `getutid' or `getutline'. You must copy the +- contents of the structure if you wish to save the information. +- +- A null pointer is returned in case the end of the database is +- reached without a match. +- +- The `getutline' function may cache the last read entry. Therefore +- if you are using `getutline' to search for multiple occurrences, it +- is necessary to zero out the static data after each call. +- Otherwise `getutline' could just return a pointer to the same +- entry over and over again. +- +- - Function: struct utmp * pututline (const struct utmp *UTMP) +- The `pututline' function inserts the entry `*UTMP' at the +- appropriate place in the user accounting database. If it finds +- that it is not already at the correct place in the database, it +- uses `getutid' to search for the position to insert the entry, +- however this will not modify the static structure returned by +- `getutent', `getutid' and `getutline'. If this search fails, the +- entry is appended to the database. +- +- The `pututline' function returns a pointer to a copy of the entry +- inserted in the user accounting database, or a null pointer if the +- entry could not be added. The following `errno' error conditions +- are defined for this function: +- +- `EPERM' +- The process does not have the appropriate privileges; you +- cannot modify the user accounting database. +- +- All the `get*' functions mentioned before store the information they +-return in a static buffer. This can be a problem in multi-threaded +-programs since the data 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 +- +- 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 +- #include +- +- static void +- enable (int sig) +- { +- mtrace (); +- signal (SIGUSR1, enable); +- } +- +- static void +- disable (int sig) +- { +- muntrace (); +- signal (SIGUSR2, disable); +- } +- +- int +- main (int argc, char *argv[]) +- { +- ... +- +- signal (SIGUSR1, enable); +- signal (SIGUSR2, disable); +- +- ... +- } +- +- I.e., the user can start the memory debugger any time s/he wants if +-the program was started with `MALLOC_TRACE' set in the environment. +-The output will of course not show the allocations which happened before +-the first signal but if there is a memory leak this will show up +-nevertheless. +- +- +-File: libc.info, Node: Interpreting the traces, Prev: Tips for the Memory Debugger, Up: Allocation Debugging +- +-Interpreting the traces +------------------------ +- +- If you take a look at the output it will look similar to this: +- +- = Start +- [0x8048209] - 0x8064cc8 +- [0x8048209] - 0x8064ce0 +- [0x8048209] - 0x8064cf8 +- [0x80481eb] + 0x8064c48 0x14 +- [0x80481eb] + 0x8064c60 0x14 +- [0x80481eb] + 0x8064c78 0x14 +- [0x80481eb] + 0x8064c90 0x14 +- = End +- +- What this all means is not really important since the trace file is +-not meant to be read by a human. Therefore no attention is 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 +- +- 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 +- #include +- #include +- #include +- #include +- +- int +- main (void) +- { +- uid_t me; +- struct passwd *my_passwd; +- struct group *my_group; +- char **members; +- +- /* Get information about the user ID. */ +- me = getuid (); +- my_passwd = getpwuid (me); +- if (!my_passwd) +- { +- printf ("Couldn't find out about user %d.\n", (int) me); +- exit (EXIT_FAILURE); +- } +- +- /* Print the information. */ +- printf ("I am %s.\n", my_passwd->pw_gecos); +- printf ("My login name is %s.\n", my_passwd->pw_name); +- printf ("My uid is %d.\n", (int) (my_passwd->pw_uid)); +- printf ("My home directory is %s.\n", my_passwd->pw_dir); +- printf ("My default shell is %s.\n", my_passwd->pw_shell); +- +- /* Get information about the default group ID. */ +- my_group = getgrgid (my_passwd->pw_gid); +- if (!my_group) +- { +- printf ("Couldn't find out about group %d.\n", +- (int) my_passwd->pw_gid); +- exit (EXIT_FAILURE); +- } +- +- /* Print the information. */ +- printf ("My default group is %s (%d).\n", +- my_group->gr_name, (int) (my_passwd->pw_gid)); +- printf ("The members of this group are:\n"); +- members = my_group->gr_mem; +- while (*members) +- { +- printf (" %s\n", *(members)); +- members++; +- } +- +- return EXIT_SUCCESS; +- } +- +- Here is some output from this program: +- +- I am Throckmorton Snurd. +- My login name is snurd. +- My uid is 31093. +- My home directory is /home/fsg/snurd. +- My default shell is /bin/sh. +- My default group is guest (12). +- The members of this group are: +- friedman +- tami +- +- +-File: libc.info, Node: Netgroup Database, Prev: Database Example, Up: Users and Groups +- +-Netgroup Database +-================= +- +-* Menu: +- +-* Netgroup Data:: Data in the Netgroup database and where +- it comes from. +-* Lookup Netgroup:: How to look for a particular netgroup. +-* Netgroup Membership:: How to test for netgroup membership. +- +- +-File: libc.info, Node: Netgroup Data, Next: Lookup Netgroup, Up: Netgroup Database +- +-Netgroup Data +-------------- +- +- Sometimes it is useful to group users according to other criteria +-(*note Group Database::.). E.g., it is useful to associate a certain +-group of users with a certain machine. On the other hand grouping of +-host names is not supported so far. +- +- In Sun Microsystems SunOS appeared a new kind of database, the +-netgroup database. It allows 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 +- #include +- #include +- #include +- +- int +- main(void) +- { +- unsigned long seed[2]; +- char salt[] = "$1$........"; +- const char *const seedchars = +- "./0123456789ABCDEFGHIJKLMNOPQRST" +- "UVWXYZabcdefghijklmnopqrstuvwxyz"; +- char *password; +- int i; +- +- /* Generate a (not very) random seed. +- You should do it better than this... */ +- seed[0] = time(NULL); +- seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000); +- +- /* Turn it into printable characters from `seedchars'. */ +- for (i = 0; i < 8; i++) +- salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f]; +- +- /* Read in the user's password and encrypt it. */ +- password = crypt(getpass("Password:"), salt); +- +- /* Print the results. */ +- puts(password); +- return 0; +- } +- +- The next program shows how to verify a password. It prompts the user +-for a password and prints "Access granted." if the user types `GNU libc +-manual'. +- +- #include +- #include +- #include +- #include +- +- int +- main(void) +- { +- /* Hashed form of "GNU libc manual". */ +- const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/"; +- +- char *result; +- int ok; +- +- /* Read in the user's password and encrypt it, +- passing the expected password in as the salt. */ +- result = crypt(getpass("Password:"), pass); +- +- /* Test the result. */ +- ok = strcmp (result, pass) == 0; +- +- puts(ok ? "Access granted." : "Access denied."); +- return ok ? 0 : 1; +- } +- +- - Function: char * crypt_r (const char * KEY, const char * SALT, +- struct crypt_data * DATA) +- The `crypt_r' function does the same thing as `crypt', but takes +- an extra parameter which includes space for its result (among +- other things), so it can be reentrant. `data->initialized' must be +- cleared to zero before the first time `crypt_r' is called. +- +- The `crypt_r' function is a GNU extension. +- +- The `crypt' and `crypt_r' functions are prototyped in the header +-`crypt.h'. +- +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 +- #include +- +- int +- add_em_up (int count,...) +- { +- va_list ap; +- int i, sum; +- +- va_start (ap, count); /* Initialize the argument list. */ +- +- sum = 0; +- for (i = 0; i < count; i++) +- sum += va_arg (ap, int); /* Get the next argument value. */ +- +- va_end (ap); /* Clean up. */ +- return sum; +- } +- +- int +- main (void) +- { +- /* This call prints 16. */ +- printf ("%d\n", add_em_up (3, 5, 5, 6)); +- +- /* This call prints 55. */ +- printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); +- +- return 0; +- } +- +- +-File: libc.info, Node: Old Varargs, Prev: Argument Macros, Up: How Variadic +- +-Old-Style Variadic Functions +-............................ +- +- Before ISO C, programmers used a slightly different facility for +-writing variadic functions. The GNU C compiler still supports it; +-currently, it is more portable than the ISO C facility, since support +-for ISO C is still not universal. The header file which defines the +-old-fashioned variadic facility is called `varargs.h'. +- +- Using `varargs.h' is almost the same as using `stdarg.h'. There is +-no difference in how you call a variadic function; see *Note Calling +-Variadics::. The only difference is in how you define them. First of +-all, you must use old-style non-prototype syntax, like this: +- +- tree +- build (va_alist) +- va_dcl +- { +- +- Secondly, you must give `va_start' 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 . +- +- 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 . Don't send a message there directly; it +-is fed to a program that expects mail to be formatted in a particular +-way. Use the script. +- +- If you are not sure how a function should behave, and this manual +-doesn't tell you, that's a bug in the manual. Report that too! If the +-function's behavior disagrees with the manual, then either the library +-or the manual has a bug, so report the disagreement. If you find any +-errors or omissions in this manual, please report them to the Internet +-address . If you refer to specific sections +-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 +-`' into your file. This causes the function to be listed +-in the installed `', and makes GNU ld warn when the +-function is used. +- +- Some rare functions are only useful on specific systems and aren't +-defined at all on others; these do not appear anywhere in the +-system-independent source code or makefiles (including the `generic' +-directory), only in the system-dependent `Makefile' in the specific +-system's subdirectory. +- +- If you come across a file that is in one of the main source +-directories (`string', `stdio', etc.), and you want to write a machine- +-or operating system-dependent version of it, move the file into +-`sysdeps/generic' and write your new implementation in the appropriate +-system-specific subdirectory. Note that if a file is to be +-system-dependent, it *must not* appear in one of the main source +-directories. +- +- There are a few special files that may exist in each subdirectory of +-`sysdeps': +- +-`Makefile' +- A makefile for this machine or operating system, or class of +- machine or operating system. This file is included by the library +- makefile `Makerules', which is used by the top-level makefile and +- the subdirectory makefiles. It can change the variables set in the +- including makefile or add new rules. It can use GNU `make' +- conditional directives based on the variable `subdir' (see above) +- to select different sets of variables and rules for different +- sections of the library. It can also set the `make' variable +- `sysdep-routines', to specify extra modules to be included in the +- library. You should use `sysdep-routines' rather than adding +- modules to `routines' because the latter is used in determining +- what to distribute for each subdirectory of the main source tree. +- +- Each makefile in a subdirectory in the ordered list of +- subdirectories to be searched is included in order. Since several +- system-dependent makefiles may be included, each should append to +- `sysdep-routines' rather than simply setting it: +- +- sysdep-routines := $(sysdep-routines) foo bar +- +-`Subdirs' +- This file contains the names of new whole subdirectories under the +- top-level library source tree that should be included for this +- system. These subdirectories are treated just like the +- system-independent subdirectories in the library source tree, such +- as `stdio' and `math'. +- +- Use this when there are completely new sets of functions and header +- files that should go into the library for the system this +- subdirectory of `sysdeps' implements. For example, +- `sysdeps/unix/inet/Subdirs' contains `inet'; the `inet' directory +- contains various network-oriented operations which only make sense +- to put in the library on systems that support the Internet. +- +-`Dist' +- This file contains the names of files (relative to the +- subdirectory of `sysdeps' in which it appears) which should be +- included in the distribution. List any new files used by rules in +- the `Makefile' in the same directory, or header files used by the +- source files in that directory. You don't need to list files that +- are implementations (either C or assembly source) of routines +- whose names are given in the machine-independent makefiles in the +- main source tree. +- +-`configure' +- This file is a shell script fragment to be run at configuration +- time. The top-level `configure' script uses the shell `.' command +- to read the `configure' file in each system-dependent directory +- chosen, in order. The `configure' files are often generated from +- `configure.in' files using Autoconf. +- +- A system-dependent `configure' script will usually add things to +- the shell variables `DEFS' and `config_vars'; see the top-level +- `configure' script for details. The script can check for +- `--with-PACKAGE' options that were passed to the top-level +- `configure'. For an option `--with-PACKAGE=VALUE' `configure' +- sets the shell variable `with_PACKAGE' (with any dashes in PACKAGE +- converted to underscores) to VALUE; if the option is just +- `--with-PACKAGE' (no argument), then it sets `with_PACKAGE' to +- `yes'. +- +-`configure.in' +- This file is an Autoconf input fragment to be processed into the +- file `configure' in this subdirectory. *Note Introduction: +- (autoconf.info)Introduction, for a description of Autoconf. You +- should write either `configure' or `configure.in', but not both. +- The first line of `configure.in' should invoke the `m4' macro +- `GLIBC_PROVIDES'. This macro does several `AC_PROVIDE' calls for +- Autoconf macros which are used by the top-level `configure' +- script; without this, those macros might be invoked again +- unnecessarily by Autoconf. +- +- That is the general system for how system-dependencies are isolated. +- +-* Menu: +- +-* Hierarchy Conventions:: The layout of the `sysdeps' hierarchy. +-* Porting to Unix:: Porting the library to an average +- Unix-like system. +- +- +-File: libc.info, Node: Hierarchy Conventions, Next: Porting to Unix, Up: Porting +- +-Layout of the `sysdeps' Directory Hierarchy +-------------------------------------------- +- +- A GNU configuration name has three parts: the CPU type, the +-manufacturer's name, and the operating system. `configure' uses these +-to pick the list of system-dependent directories to look for. If the +-`--nfp' option is *not* passed to `configure', the directory +-`MACHINE/fpu' is also used. The operating system often has a "base +-operating system"; for example, if the operating system is `Linux', the +-base operating system is `unix/sysv'. The algorithm used to pick the +-list of directories is simple: `configure' makes a list of the base +-operating system, manufacturer, CPU type, and operating system, in that +-order. It then concatenates all these together with slashes in +-between, to produce a directory name; for example, the configuration +-`i686-linux-gnu' results in `unix/sysv/linux/i386/i686'. `configure' +-then tries removing each element of the list in turn, so +-`unix/sysv/linux' and `unix/sysv' are also tried, among others. Since +-the precise version number of the operating system is often not +-important, and it would be very inconvenient, for example, to have +-identical `irix6.2' and `irix6.3' directories, `configure' tries +-successively less specific operating system names by removing trailing +-suffixes starting with a period. +- +- As an example, here is the complete list of directories that would be +-tried for the configuration `i686-linux-gnu' (with the `crypt' and +-`linuxthreads' add-on): +- +- sysdeps/i386/elf +- crypt/sysdeps/unix +- linuxthreads/sysdeps/unix/sysv/linux +- linuxthreads/sysdeps/pthread +- linuxthreads/sysdeps/unix/sysv +- linuxthreads/sysdeps/unix +- linuxthreads/sysdeps/i386/i686 +- linuxthreads/sysdeps/i386 +- linuxthreads/sysdeps/pthread/no-cmpxchg +- sysdeps/unix/sysv/linux/i386 +- sysdeps/unix/sysv/linux +- sysdeps/gnu +- sysdeps/unix/common +- sysdeps/unix/mman +- sysdeps/unix/inet +- sysdeps/unix/sysv/i386/i686 +- sysdeps/unix/sysv/i386 +- sysdeps/unix/sysv +- sysdeps/unix/i386 +- sysdeps/unix +- sysdeps/posix +- sysdeps/i386/i686 +- sysdeps/i386/i486 +- sysdeps/libm-i387/i686 +- sysdeps/i386/fpu +- sysdeps/libm-i387 +- sysdeps/i386 +- sysdeps/wordsize-32 +- sysdeps/ieee754 +- sysdeps/libm-ieee754 +- sysdeps/generic +- +- Different machine architectures are conventionally subdirectories at +-the top level of the `sysdeps' directory tree. For example, +-`sysdeps/sparc' and `sysdeps/m68k'. These contain files specific to +-those machine architectures, but not specific to any particular +-operating system. There might be subdirectories for specializations of +-those architectures, such as `sysdeps/m68k/68020'. Code which is +-specific to the floating-point coprocessor used with a particular +-machine should go in `sysdeps/MACHINE/fpu'. +- +- There are a few directories at the top level of the `sysdeps' +-hierarchy that are not for particular machine architectures. +- +-`generic' +- As described above (*note Porting::.), this is the subdirectory +- that every configuration implicitly uses after all others. +- +-`ieee754' +- This directory is for code using the IEEE 754 floating-point +- format, where the C type `float' is IEEE 754 single-precision +- format, and `double' is IEEE 754 double-precision format. Usually +- this directory is referred to in the `Implies' file in a machine +- architecture-specific directory, such as `m68k/Implies'. +- +-`libm-ieee754' +- This directory contains an implementation of a mathematical library +- usable on platforms which use IEEE 754 conformant floating-point +- arithmetic. +- +-`libm-i387' +- This is a special case. Ideally the code should be in +- `sysdeps/i386/fpu' but for various reasons it is kept aside. +- +-`posix' +- This directory contains implementations of things in the library in +- terms of POSIX.1 functions. This includes some of the POSIX.1 +- functions themselves. Of course, POSIX.1 cannot be completely +- implemented in terms of itself, so a configuration using just +- `posix' cannot be complete. +- +-`unix' +- This is the directory for Unix-like things. *Note Porting to +- Unix::. `unix' implies `posix'. There are some special-purpose +- subdirectories of `unix': +- +- `unix/common' +- This directory is for things common to both BSD and System V +- release 4. Both `unix/bsd' and `unix/sysv/sysv4' imply +- `unix/common'. +- +- `unix/inet' +- This directory is for `socket' and related functions on Unix +- systems. `unix/inet/Subdirs' enables the `inet' top-level +- subdirectory. `unix/common' implies `unix/inet'. +- +-`mach' +- This is the directory for things based on the Mach microkernel +- from CMU (including the GNU operating system). Other basic +- operating systems (VMS, for example) would have their own +- directories at the top level of the `sysdeps' hierarchy, parallel +- to `unix' and `mach'. +- +- +-File: libc.info, Node: Porting to Unix, Prev: Hierarchy Conventions, Up: Porting +- +-Porting the GNU C Library to Unix Systems +------------------------------------------ +- +- Most Unix systems are fundamentally very similar. There are +-variations between different machines, and variations in what +-facilities are provided by the kernel. But the interface to the +-operating system facilities is, for the most part, pretty uniform and +-simple. +- +- The code for Unix systems is in the directory `unix', at the top +-level of the `sysdeps' hierarchy. This directory contains +-subdirectories (and subdirectory trees) for various Unix variants. +- +- The functions which are system calls in most Unix systems are +-implemented in assembly code, which is generated automatically from +-specifications in files named `syscalls.list'. There are several such +-files, one in `sysdeps/unix' and others in its subdirectories. Some +-special system calls are implemented in files that are named with a +-suffix of `.S'; for example, `_exit.S'. Files ending in `.S' are run +-through the C preprocessor before being fed to the assembler. +- +- These files all use a set of macros that should be defined in +-`sysdep.h'. The `sysdep.h' file in `sysdeps/unix' partially defines +-them; a `sysdep.h' file in another directory must finish defining them +-for the particular machine and operating system variant. See +-`sysdeps/unix/sysdep.h' and the machine-specific `sysdep.h' +-implementations to see what these macros are and what they should do. +- +- The system-specific makefile for the `unix' directory +-(`sysdeps/unix/Makefile') gives rules to generate several files from +-the Unix system you are building the library on (which is assumed to be +-the target system you are building the library *for*). All the +-generated files are put in the directory where the object files are +-kept; they should not affect the source tree itself. The files +-generated are `ioctls.h', `errnos.h', `sys/param.h', and `errlist.c' +-(for the `stdio' section of the library). +- +diff -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 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 . +- +- +- +-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 +- #include +- +- int +- main (void) +- { +- char buffer[10]; +- char *to = buffer; +- to = stpcpy (to, "foo"); +- to = stpcpy (to, "bar"); +- puts (buffer); +- return 0; +- } +- +- This function is not part of the ISO or POSIX standards, and is not +- customary on Unix systems, but we did not invent it either. +- Perhaps it comes from MS-DOG. +- +- Its behavior is undefined if the strings overlap. +- +- - 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 +- #include +- #include +- +- const char path[] = _PATH_STDPATH; +- +- int +- main (void) +- { +- char *wr_path = strdupa (path); +- char *cp = strtok (wr_path, ":"); +- +- while (cp != NULL) +- { +- puts (cp); +- cp = strtok (NULL, ":"); +- } +- return 0; +- } +- +- Please note that calling `strtok' using PATH directly is invalid. +- +- 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 +- #include +- +- #define SIZE 10 +- +- static char buffer[SIZE]; +- +- main () +- { +- strncpy (buffer, "hello", SIZE); +- puts (buffer); +- strncat (buffer, ", world", SIZE - strlen (buffer) - 1); +- puts (buffer); +- } +- +-The output produced by this program looks like: +- +- hello +- hello, wo +- +- - Function: void bcopy (const void *FROM, void *TO, size_t SIZE) +- This is a partially obsolete alternative for `memmove', derived +- from BSD. Note that it is not quite equivalent to `memmove', +- because the arguments are not in the same order and there is no +- return value. +- +- - Function: void bzero (void *BLOCK, size_t SIZE) +- This is a partially obsolete alternative for `memset', derived from +- BSD. Note that it is not as general as `memset', because the only +- value it can store is zero. +- +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 +- #include +- +- ... +- +- const char string[] = "words separated by spaces -- and, punctuation!"; +- const char delimiters[] = " .,;:!-"; +- char *token, *cp; +- +- ... +- +- cp = strdupa (string); /* Make writable copy. */ +- token = strtok (cp, delimiters); /* token => "words" */ +- token = strtok (NULL, delimiters); /* token => "separated" */ +- token = strtok (NULL, delimiters); /* token => "by" */ +- token = strtok (NULL, delimiters); /* token => "spaces" */ +- token = strtok (NULL, delimiters); /* token => "and" */ +- token = strtok (NULL, delimiters); /* token => "punctuation" */ +- token = strtok (NULL, delimiters); /* token => NULL */ +- +- The GNU C library contains two more functions for tokenizing a string +-which overcome the limitation of non-reentrancy. +- +- - 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 +- #include +- +- ... +- +- const char string[] = "words separated by spaces -- and, punctuation!"; +- const char delimiters[] = " .,;:!-"; +- char *running; +- char *token; +- +- ... +- +- running = strdupa (string); +- token = strsep (&running, delimiters); /* token => "words" */ +- token = strsep (&running, delimiters); /* token => "separated" */ +- token = strsep (&running, delimiters); /* token => "by" */ +- token = strsep (&running, delimiters); /* token => "spaces" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "and" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "punctuation" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => NULL */ +- +- +-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 +-#include +-#include +- +-/* @r{Flag set by @samp{--verbose}.} */ +-static int verbose_flag; +- +-int +-main (argc, argv) +- int argc; +- char **argv; +-@{ +- int c; +- +- while (1) +- @{ +- static struct option long_options[] = +- @{ +- /* @r{These options set a flag.} */ +- @{"verbose", 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 +- +-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 +- +-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 +-#include +-#include +-#include +-#include +-#include +- +-int +-make_named_socket (const char *filename) +-@{ +- struct sockaddr_un name; +- int sock; +- size_t size; +- +- /* @r{Create the socket.} */ +- sock = socket (PF_LOCAL, SOCK_DGRAM, 0); +- if (sock < 0) +- @{ +- perror ("socket"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Bind a name to the socket.} */ +- name.sun_family = AF_LOCAL; +- strncpy (name.sun_path, filename, sizeof (name.sun_path)); +- +- /* @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 +-#include +-#include +-#include +- +-int +-make_socket (uint16_t port) +-@{ +- int sock; +- struct sockaddr_in name; +- +- /* @r{Create the socket.} */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- @{ +- perror ("socket"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Give the socket a name.} */ +- name.sin_family = AF_INET; +- name.sin_port = htons (port); +- name.sin_addr.s_addr = htonl (INADDR_ANY); +- if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) +- @{ +- perror ("bind"); +- exit (EXIT_FAILURE); +- @} +- +- return sock; +-@} +diff -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 +-#include +-#include +-#include +- +-/* @r{Read characters from the pipe and echo them to @code{stdout}.} */ +- +-void +-read_from_pipe (int file) +-@{ +- FILE *stream; +- int c; +- stream = fdopen (file, "r"); +- while ((c = fgetc (stream)) != EOF) +- putchar (c); +- fclose (stream); +-@} +- +-/* @r{Write some random text to the pipe.} */ +- +-void +-write_to_pipe (int file) +-@{ +- FILE *stream; +- stream = fdopen (file, "w"); +- fprintf (stream, "hello, world!\n"); +- fprintf (stream, "goodbye, world!\n"); +- fclose (stream); +-@} +- +-int +-main (void) +-@{ +- pid_t pid; +- int mypipe[2]; +- +-@group +- /* @r{Create the pipe.} */ +- if (pipe (mypipe)) +- @{ +- fprintf (stderr, "Pipe failed.\n"); +- return EXIT_FAILURE; +- @} +-@end group +- +- /* @r{Create the child process.} */ +- pid = fork (); +- if (pid == (pid_t) 0) +- @{ +- /* @r{This is the child process.} */ +- 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 +-#include +- +-void +-write_data (FILE * stream) +-@{ +- int i; +- for (i = 0; i < 100; i++) +- fprintf (stream, "%d\n", i); +- if (ferror (stream)) +- @{ +- fprintf (stderr, "Output to stream failed.\n"); +- exit (EXIT_FAILURE); +- @} +-@} +- +-@group +-int +-main (void) +-@{ +- FILE *output; +- +- output = popen ("more", "w"); +- if (!output) +- @{ +- fprintf (stderr, "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 +-#include +-#include +- +-@group +-typedef struct +-@{ +- char *name; +-@} +-Widget; +-@end group +- +-int +-print_widget (FILE *stream, +- const struct printf_info *info, +- const void *const *args) +-@{ +- const Widget *w; +- char *buffer; +- int len; +- +- /* @r{Format the output into a string.} */ +- w = *((const Widget **) (args[0])); +- len = asprintf (&buffer, "", w, w->name); +- if (len == -1) +- return -1; +- +- /* @r{Pad to the minimum field width and print to the stream.} */ +- len = fprintf (stream, "%*s", +- (info->left ? -info->width : info->width), +- buffer); +- +- /* @r{Clean up and return.} */ +- free (buffer); +- return len; +-@} +- +- +-int +-print_widget_arginfo (const struct printf_info *info, size_t n, +- int *argtypes) +-@{ +- /* @r{We always take exactly one argument and this is a pointer to the +- structure..} */ +- if (n > 0) +- argtypes[0] = PA_POINTER; +- return 1; +-@} +- +- +-int +-main (void) +-@{ +- /* @r{Make a widget to print.} */ +- Widget mywidget; +- mywidget.name = "mywidget"; +- +- /* @r{Register the print function for widgets.} */ +- register_printf_function ('W', print_widget, print_widget_arginfo); +- +- /* @r{Now print the widget.} */ +- printf ("|%W|\n", &mywidget); +- printf ("|%35W|\n", &mywidget); +- printf ("|%-35W|\n", &mywidget); +- +- return 0; +-@} +diff -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 +-#include +-#include +- +-/* @r{Define an array of critters to sort.} */ +- +-struct critter +- @{ +- const char *name; +- const char *species; +- @}; +- +-struct critter muppets[] = +- @{ +- @{"Kermit", "frog"@}, +- @{"Piggy", "pig"@}, +- @{"Gonzo", "whatever"@}, +- @{"Fozzie", "bear"@}, +- @{"Sam", "eagle"@}, +- @{"Robin", "frog"@}, +- @{"Animal", "animal"@}, +- @{"Camilla", "chicken"@}, +- @{"Sweetums", "monster"@}, +- @{"Dr. Strangepork", "pig"@}, +- @{"Link Hogthrob", "pig"@}, +- @{"Zoot", "human"@}, +- @{"Dr. Bunsen Honeydew", "human"@}, +- @{"Beaker", "human"@}, +- @{"Swedish Chef", "human"@} +- @}; +- +-int count = sizeof (muppets) / sizeof (struct critter); +- +- +- +-/* @r{This is the comparison function used for sorting and searching.} */ +- +-int +-critter_cmp (const struct critter *c1, const struct critter *c2) +-@{ +- return strcmp (c1->name, c2->name); +-@} +- +- +-/* @r{Print information about a critter.} */ +- +-void +-print_critter (const struct critter *c) +-@{ +- printf ("%s, the %s\n", c->name, c->species); +-@} +- +- +-@group +-/* @r{Do the lookup into the sorted array.} */ +- +-void +-find_critter (const char *name) +-@{ +- struct critter target, *result; +- target.name = name; +- result = bsearch (&target, muppets, count, sizeof (struct critter), +- critter_cmp); +- if (result) +- print_critter (result); +- else +- printf ("Couldn't find %s.\n", name); +-@} +-@end group +- +-/* @r{Main program.} */ +- +-int +-main (void) +-@{ +- int i; +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- qsort (muppets, count, sizeof (struct critter), critter_cmp); +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- find_critter ("Kermit"); +- find_critter ("Gonzo"); +- find_critter ("Janice"); +- +- return 0; +-@} +diff -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 +-#include +-#include +-#include +-@end group +- +-@group +-int +-input_timeout (int filedes, unsigned int seconds) +-@{ +- fd_set set; +- struct timeval timeout; +-@end group +- +- /* @r{Initialize the file descriptor set.} */ +- FD_ZERO (&set); +- FD_SET (filedes, &set); +- +- /* @r{Initialize the timeout data structure.} */ +- timeout.tv_sec = seconds; +- timeout.tv_usec = 0; +- +-@group +- /* @r{@code{select} returns 0 if timeout, 1 if input available, -1 if error.} */ +- return TEMP_FAILURE_RETRY (select (FD_SETSIZE, +- &set, NULL, NULL, +- &timeout)); +-@} +-@end group +- +-@group +-int +-main (void) +-@{ +- fprintf (stderr, "select returned %d.\n", +- input_timeout (STDIN_FILENO, 5)); +- return 0; +-@} +-@end group +diff -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 +-#include +-#include +- +-jmp_buf main_loop; +- +-void +-abort_to_main_loop (int status) +-@{ +- longjmp (main_loop, status); +-@} +- +-int +-main (void) +-@{ +- while (1) +- if (setjmp (main_loop)) +- puts ("Back at main loop...."); +- else +- do_command (); +-@} +- +- +-void +-do_command (void) +-@{ +- char buffer[128]; +- if (fgets (buffer, 128, stdin) == NULL) +- abort_to_main_loop (-1); +- else +- exit (EXIT_SUCCESS); +-@} +diff -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 +-#include +-#include +- +-/* @r{This flag controls termination of the main loop.} */ +-volatile sig_atomic_t keep_going = 1; +- +-/* @r{The signal handler just clears the flag and re-enables itself.} */ +-void +-catch_alarm (int sig) +-@{ +- keep_going = 0; +- signal (sig, catch_alarm); +-@} +- +-void +-do_stuff (void) +-@{ +- puts ("Doing stuff while waiting for alarm...."); +-@} +- +-int +-main (void) +-@{ +- /* @r{Establish a handler for SIGALRM signals.} */ +- signal (SIGALRM, catch_alarm); +- +- /* @r{Set an alarm to go off in a little while.} */ +- alarm (2); +- +- /* @r{Check the flag once in a while to see when to quit.} */ +- while (keep_going) +- do_stuff (); +- +- return EXIT_SUCCESS; +-@} +diff -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 +-#include +-#include +-#include +-@end group +- +-/* @r{When a @code{SIGUSR1} signal arrives, set this variable.} */ +-volatile sig_atomic_t usr_interrupt = 0; +- +-void +-synch_signal (int sig) +-@{ +- usr_interrupt = 1; +-@} +- +-/* @r{The child process executes this function.} */ +-void +-child_function (void) +-@{ +- /* @r{Perform initialization.} */ +- printf ("I'm here!!! My pid is %d.\n", (int) getpid ()); +- +- /* @r{Let parent know you're done.} */ +- kill (getppid (), SIGUSR1); +- +- /* @r{Continue with execution.} */ +- puts ("Bye, now...."); +- exit (0); +-@} +- +-int +-main (void) +-@{ +- struct sigaction usr_action; +- sigset_t block_mask; +- pid_t child_id; +- +- /* @r{Establish the signal handler.} */ +- sigfillset (&block_mask); +- usr_action.sa_handler = synch_signal; +- usr_action.sa_mask = block_mask; +- usr_action.sa_flags = 0; +- sigaction (SIGUSR1, &usr_action, NULL); +- +- /* @r{Create the child process.} */ +- child_id = fork (); +- if (child_id == 0) +- child_function (); /* @r{Does not return.} */ +- +-@group +- /* @r{Busy wait for the child to send a signal.} */ +- while (!usr_interrupt) +- ; +-@end group +- +- /* @r{Now continue execution.} */ +- puts ("That's all, folks!"); +- +- return 0; +-@} +diff -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 +-#include +- +-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 +-#include +-#include +- +-const char path[] = _PATH_STDPATH; +- +-int +-main (void) +-@{ +- char *wr_path = strdupa (path); +- char *cp = strtok (wr_path, ":"); +- +- while (cp != NULL) +- @{ +- puts (cp); +- cp = strtok (NULL, ":"); +- @} +- return 0; +-@} +diff -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 +-#include +- +-#define SIZE 256 +- +-int +-main (void) +-@{ +- char buffer[SIZE]; +- time_t curtime; +- struct tm *loctime; +- +- /* @r{Get the current time.} */ +- curtime = time (NULL); +- +- /* @r{Convert it to local time representation.} */ +- loctime = localtime (&curtime); +- +- /* @r{Print out the date and time in the standard format.} */ +- fputs (asctime (loctime), stdout); +- +-@group +- /* @r{Print it out in a nice format.} */ +- strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime); +- fputs (buffer, stdout); +- strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime); +- fputs (buffer, stdout); +- +- return 0; +-@} +-@end group +diff -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 +-#include +- +-#define SIZE 10 +- +-static char buffer[SIZE]; +- +-main () +-@{ +- strncpy (buffer, "hello", SIZE); +- puts (buffer); +- strncat (buffer, ", world", SIZE - strlen (buffer) - 1); +- puts (buffer); +-@} +diff -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 +-#include +- +-int do_all; +-const char *type; +-int read_size; +-int write_size; +-int read_only; +- +-enum +-@{ +- RO_OPTION = 0, +- RW_OPTION, +- READ_SIZE_OPTION, +- WRITE_SIZE_OPTION +-@}; +- +-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 +-#include +-#include +-#include +- +-/* @r{Use this variable to remember original terminal attributes.} */ +- +-struct termios saved_attributes; +- +-void +-reset_input_mode (void) +-@{ +- tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes); +-@} +- +-void +-set_input_mode (void) +-@{ +- struct termios tattr; +- char *name; +- +- /* @r{Make sure stdin is a terminal.} */ +- if (!isatty (STDIN_FILENO)) +- @{ +- fprintf (stderr, "Not a terminal.\n"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Save the terminal attributes so we can restore them later.} */ +- tcgetattr (STDIN_FILENO, &saved_attributes); +- atexit (reset_input_mode); +- +-@group +- /* @r{Set the funny terminal modes.} */ +- tcgetattr (STDIN_FILENO, &tattr); +- tattr.c_lflag &= ~(ICANON|ECHO); /* @r{Clear ICANON and ECHO.} */ +- tattr.c_cc[VMIN] = 1; +- tattr.c_cc[VTIME] = 0; +- tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); +-@} +-@end group +- +-int +-main (void) +-@{ +- char c; +- +- set_input_mode (); +- +- while (1) +- @{ +- read (STDIN_FILENO, &c, 1); +- if (c == '\004') /* @r{@kbd{C-d}} */ +- break; +- else +- putchar (c); +- @} +- +- return EXIT_SUCCESS; +-@} +diff -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 +-#include +- +-int +-main (int argc, char **argv) +-@{ +- int aflag = 0; +- int bflag = 0; +- char *cvalue = NULL; +- int index; +- int c; +- +- opterr = 0; +-@end group +- +-@group +- while ((c = getopt (argc, argv, "abc:")) != -1) +- switch (c) +- @{ +- case 'a': +- aflag = 1; +- break; +- case 'b': +- bflag = 1; +- break; +- case 'c': +- cvalue = optarg; +- break; +- case '?': +- if (isprint (optopt)) +- fprintf (stderr, "Unknown option `-%c'.\n", optopt); +- else +- fprintf (stderr, +- "Unknown option character `\\x%x'.\n", +- optopt); +- return 1; +- default: +- abort (); +- @} +-@end group +- +-@group +- printf ("aflag = %d, bflag = %d, cvalue = %s\n", +- aflag, bflag, cvalue); +- +- for (index = optind; index < argc; index++) +- printf ("Non-option argument %s\n", argv[index]); +- return 0; +-@} +-@end group +diff -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 ++#include ++#include ++#include ++#include ++ ++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 ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* ++ * 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 ++ ++__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 ++ ++ ++/* 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 ++#include + + 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ôKMLEUL&›L(ÂLëLüLM&M5MIMdM~Mn’MOO"%O"HOkO:‡OÂOËOÔOêOPP2PLPePPšP¶PÐPíPQ#Q*Q EQRQYQ3kQ3ŸQ4ÓQ.R%7R]R&qR%˜R¾R%ÕR3ûR,/S)\S†S"ŸS!ÂSäSûST.TDT"ZT*}T¨T&ÂT&éT&U&7U&^U…U U$¾UãUþUV,2V_V%}V,£V-ÐV þV&WFWeW„WžW²WÒW‰òW2|X¯X"ÊX4íX"Y#4Y XY=bY Y<±YîY'Z6Z)?Z(iZ ’Z³ZµZ½Z$ÎZóZ) +-[(4[][ m[y[#[/´[ä[ö[ \ \%\9\ N\Z\j\\ ›\¨\¾\ Õ\ á\ë\ï\ ]&]-<]!j]Œ]ª]È]ß]&ÿ]%&^0L^!}^Ÿ^-·^å^%_)(_'R_%z_& _Ç_ã_ ý_ +-`%`<`X`u`@Ž`DÏ`a'a@a Ua=_aaÇ·ab7žb2Öb- c7c$Jc +-oczc€c!„c¦c·cÐcícdd/dJd^drd3†d-ºd2ède,e5e;jzjƒj‡jšj!®j Ðj!Ýjÿj.kMk ak nk"{kžk±kÄk Úkäk+ük(lElVlmlŠl¤l¼lØlðl +-m1m$Mmrm„mŸm´mÏm çmômn +-n#n*n20ncnrn‹n šn¨nÄnÚnón oo!3oUosos“op*pCp]pnppžp±pÅpÝpópq qq9qVqnq„q,q +-ÊqÕq Üqéqr#r>rXrprr#¢rÆrÖrírs#&sJsjssss s²sÊsÝsæsöst1tPtptt™t¨tÂtÕtôtu*#uNuUumu‰u ™u!£u ÅuÏuéu v"v @vMvavrvƒv v(¾vçvww5wOwew~wŽw w´w½wÓwãw.ów"x 4x#Bx0fx%—x½xÑxçxøx y#y@yOymy„y›yºyØyÝyðyz+zEz_zqzƒzz·zÐzìz! {.{G{b{~{—{µ{"Î{ ñ{þ{ |$|8|J|`|-o|-|!Ë|í|}}2}C}2Z}#} ±}¾};Ò}~$~@~X~ r~ €~¡~¿~Ð~Ö~ð~/J&cŠŸ´½Ü ö€$0€ U€ c€o€…€š€²€º€Ë€߀ô€ *((S |‰"ƒÀD‚K‚$e‚ +-Š‚•‚«¤‚P„ `„n„!‚„¤„³„Ç„å„"ø„…*…@…S…'c…#‹…6¯… æ… +-ô…ÿ…"†"*†M†"g†Š†ª†ĆÛ† ñ†ÿ† ‡‡*‡C‡Z‡o‡‡–‡«‡½‡χ á‡î‡ ˆˆ#%ˆ:Iˆ„ˆšˆ%°ˆÖˆ"숉!‰ @‰"a‰ „‰¥‰¿‰ωá‰æ‰ë‰Š!ŠF>Š …Š.Š-¾Š6ìŠ8#‹;\‹I˜‹â‹ú‹Œ+$Œ+PŒ'|Œ¤Œ ÄŒ ьیùŒ&(.O&~¥,µâŽCŽ#aŽ…Ž¤Ž!ÀŽ"âŽ. 4%U;{&·Þ1þ0 KW"h‹'§Ïç.‘3‘"J‘(m‘-–‘Ä‘Ü‘!ù‘’8’X’t’!’²’Ê’æ’9ý’47“8l“+¥“8Ñ“$ +-”"/”!R”.t”£””á”<•;>•$z•Ÿ•·•*ו7–:–"Y–|–)–N¹–U—^—&|—)£— Í—Û—+ô— ˜>˜X˜j˜"Š˜%­˜*Ó˜*þ˜)™=™0W™ˆ™§™+Ç™7ó™#+šOš!mš$š!´šÖš&ñš%›,>›k›'z›%¢›0È›2ù› ,œ.9œhœKœLÍœLg+{2§2Ú/ ž$=žbž%xž-žž$Ìžñž Ÿ'Ÿ:Ÿ(QŸ&zŸ!¡ŸßFÚŸ! B4 Bw ?º <ú 77¡o¡Š¡#¥¡.É¡0ø¡0)¢Z¢x¢‹¢§¢¼¢Тå¢ÿ¢£%£;£O£#d£5ˆ£G¾£ ¤#¤58¤ n¤{¤-’¤!À¤(â¤- ¥9¥J¥'\¥?„¥=Ä¥ ¦.¦ ?¦9`¦;š¦,Ö¦*§#.§R§%l§A’§Ô§ñ§I¨7X¨3¨+Ĩð¨'©!/©Q©.b©‘©C¤©*è© ªª(8ªaª1tª¦ªÁª:ݪ«)6«*`«#‹«¯«$Ï«ô«¬",¬O¬m¬‡¬¤¬>Ĭ­!"­ D­(e­$Ž­³­*É­=ô­H2®{®Š®Eš®&à®(¯'0¯EX¯ž¯(·¯'à¯$°,-°)Z°%„°ª°"È°ë°& ±0±PO±V ±U÷±OM²V²!ô²'³*>³/i³*™³$ij/é³1´/K´){´*¥´)д#ú´µ-9µ&gµ4Žµ(õìµ ¶ ¶#(¶$L¶"q¶”¶ª¶ĶÛ¶.춷;·3X·Œ·#ž·· Û·å·0ü·-¸$I¸n¸‡¸#˜¸ ¼¸ȸݸñ¸¹)¹4B¹w¹Š¹§¹'ǹBï¹D2ºjwºKâº?.»n»»!ª»Ì»æ»¼¼"3¼V¼r¼ƒ¼¡¼#»¼#ß¼#½0'½#X½|½š½*¸½%ã½* ¾4¿J¿d`¿XÅ¿.À0MÀ~À’À©À¾ÀÐÀçÀÁÁ‚2ÁµÂÈÂ-ÜÂ- +-Ã8ÃLWäíöÃÊÃãÃþÃÄ2ÄPÄpÄŽÄ®ÄÌÄìÄÅ#Å,ÅIÅ XÅdÅ/wÅ/§Å=×Å.Æ%DÆjÆ)ŠÆ&´ÆÛÆ.òÆ1!Ç6SÇ-ŠÇ¸Ç"ÓÇ(öÇÈ9ÈRÈrÈŠÈ£È1¼ÈîÈ&É&.É&UÉ&|É&£ÉÊÉ,æÉ,Ê@Ê_Ê{Ê1—Ê#ÉÊ$íÊ1Ë2DË&wË%žËÄË,ÞË Ì'Ì:ÌWÌžtÌ5ÍIÍ dÍ-…ͳÍ-ÅÍóÍR÷ÍJÎM]ΫÎÈÎ +-æÎ*ñÎ!Ï>Ï[Ï]ÏyÏ"ŒÏ¯Ï&ÅÏ'ìÏÐ)Ð9Ð$XÐ/}ЭÐ!ÍÐïÐ ÑÑ(Ñ <ÑJÑiÑÑ —Ñ¥Ñ/ÁÑñÑ, Ò8Ò-<ÒjÒ,ƒÒ5°Ò æÒÓ"Ó=Ó!RÓ0tÓ%¥Ó4ËÓ'Ô(ÔAÔXÔ+vÔ+¢Ô.ÎÔ&ýÔ8$Õ!]ÕÕ™Õ"³ÕÖÕíÕ' Ö3Ö?HÖFˆÖÏÖáÖ$×%×8>×wו×*ªØGÕØ.Ù7LÙ„Ù0™ÙÊÙÓÙÙÙÝÙýÙÚ2ÚPÚdÚ&‚Ú©ÚÅÚÛÚðÚD Û'NÛ:vÛ±ÛÇÛÙÛáÛñÛ ÜJ$Ü%oÜ3•Ü.ÉÜøÜ#Ý4+Ý=`ÝžÝ-¼ÝêÝ)þÝ(Þ'DÞlÞƒÞ*ŸÞ'ÊÞòÞ ßߟ0ßÐß0åßà5àJà[àqà$„à%©àÏà0éà.á0Iá1zá.¬áÛá#òáâR1â„â–âšâ²â"Ðâóâ ã 0ã%Qãwã +-”ãŸã"°ãÓãèãúãä"ä3;äoä‹ä ä¶äÔäïäå$å$;å`å9så%­åÓåíå ææ=æ Væ dæqæ +-‰æ”æ¤æ6«æâæ÷æç',ç"Tçwçˆç¡ç½ç"Ïç)òçè'0èXXè±è<Áèþèé,é'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ò8dò&òÄòäòóó%6ó\óyó!‰ó«óÅóÞó!úóô,ô Aôbô}ôšô´ôÌôÝô#øôõ:õYõuõ“õªõÊõèõ"ö)ö&Gö nözöö£öµöÊöàö:ðö7+÷,c÷!÷²÷É÷*é÷ø41ø3føšø{¢øšù¹ù!Òùôù0 ú=ú!Tú*vú¡ú¼úÂú'Üú'û,ûIûaû.wû¦û½ûÏû/Øûü*"üMü7kü £ü±üÏüíüýý.ý Cý!dý†ý›ý¶ý#½ý<áý þ,þ/Aþqþÿ +-ÿ%$ÿJÿ\ÿIsÿ½ÍÝ'ó(/2X2‹"¾áø/&B%i>Î +-ßê#ò#: Wx"—ºÙ ïý +C[qƒ™®¿Ð áí!#*NN((Æ+ï%$Af&,¨!Õ&÷  ?K\af}!•U· "-<<j:§@â?# c } ™ '¢ 'Ê (ò # +-? +-O +-_ +- +-Ÿ +-+µ +-7á +-4 N 3k 2Ÿ Ò Fí (4 8]  – !· "Ù !ü ' .F =u  ³ !Ô #ö  8F(Y!‚6¤Û"ù5R$j'*·â&ø-*Mx˜.·%æ &BA_0¡1Ò(;-"i#Œ&°4×" "/#R<v=³!ñ&-(T4}!²/Ô1LJM—å  "CS=lªÊâ&ú"!(D9m3§Ûí(!/(Q/z5ª)à +-)#)M(w! 0Âó% /+>+j,–7à û%BKWK£Iï9(M1v+¨+Ô))*$T/y©Ãß÷ '')O!y›CµùDBT7—:Ï@ +- K e &‚ -© /× /!&7!^!y!‘!¥!º!Ñ!ë!""-"@"+S"-"*­"Ø"!ï"F# X#y#=—#+Õ#/$+1$]$m$*~$=©$>ç$&%':% b%>ƒ%BÂ%)&</&"l&"&.²&Aá&&#'"J'Pm'@¾'<ÿ'-<($j(6(!Æ(è(/) 0)6>)*u) )°),Ë)ø), *8*U*:o*ª*$Å**ê*$+&:+%a+‡+§+*Ã+0î+,=,],6|,0³,'ä,2 -?-_-{-+”-9À-*ú-%.6.FH..)¯.(Ù.D/(G/5p/2¦/(Ù/706:0)q0!›0-½0!ë0# 1"11CT1?˜1LØ1E%2Uk2#Á2+å2(3+:3*f3#‘3/µ3-å3.4,B4Bo4:²4'í451558g5E 5'æ56%686!G6"i6&Œ6³6$Ó6ø676!7X7$m73’7Æ7*Ö788)8*;8f8(8!¨8Ê8'Ü89909C9V9r9$Œ9±9%Í9"ó9#:=::<x:^µ:J;:_;š;"¶;&Ù;<<:<Q<5f<œ< ²<!À<â<!ù<!=!==._=!Ž=!°=!Ò=<ô=(1>ÙkÝß@,Œ(Èø:CØ÷p}Õë2ÑëkD†!aSqäJw7ºý@„EVH¿sèlsŠu[¢vË©á: ã6=u‚ño.£ |dãpÔ9™$–[¥l?úC`ŒŒ‡*€X9IÊSVp!Ò…ydá‡þ£בQò1õÂn^ +- m4·¨?îm³rŠþ]„ý‚Ì#´/_JÄœsfQ8årÍz•ƒ<ÖxB{Kˆå>÷DM¢œùÓ>·ÇoiÃ@xµûb ¶ga„Eoe-xWØ؃ZsR"ˆ4/îÁ*Û(äÇ…1 kLVÌN)²‰Ay¹*íf$XQ)#K¤ûÕ[qDáè½TaÄ.ÜùT,'ûu\àê!3ë‹g +-=H]Ó-5Oz»ßj«¬Ú ƒõôïí¿®Á”.¯ø†G’jJZ„R™›C¯3ÿÆ%e`«Ô¡ÉUm{QcP˜«¾òÀƺ6rÍ`ÿ³tôe5‹Fh|›§ìbܱ²ÈeÙ\~2E j¼#š þmÅy ¶1Mö\»4fR ¨×7YŠfL˜FΠª ‰<È¥  Ú’³{iYÏãç÷ %ÿ§(cŽÒ~,Ÿ{é‚ ñC5"Ñ?Ðv)…? +-+/~_"}W|ÛÉdµ¡O"=™R¤Lݽ@uÄ7^ý®8P‡Ãªy` <w}_¨'HdÑnš®ïH”GŽ5>+SÕ-Ý­Yú!©¾Iõgl¼^zßÒvžÞ¹öͤNA|ôtWÏ·+ðƒ$3h̪cèŒb&A´ib[ ¦8Û“ÞOàÔo×Y#róN0——í;n°Ü%‚ñó¼Ëžð E K +-M꿬âh¬XTt ¾^ü9‹M J”âµ>+Š(ì2c±‘6&£œV)†ü›¡¦úU=B•“º;véÊì0Ë€ZüÊï%ɯâ½~]ಘð1¶Np2i':0-DÅ°¸S­ÚÖWL8Óꦟî}¹ç,ø°¸Ðtäö&‘Bw†ælÏIæó‹å6'“ÎçUÙ‰À:*øF‰»– n.…q7éx/Þw;ŸÇž’À&§´G;TZF©g4ˆqò_OKP\–Æ—X•IzÅÂÁ‡G0aAˆBæjUù­€€š<$Ðk¥¢ÎÖ]PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Czech +-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: musí být vìt¹í ne¾ +-%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 rozsahznak nesmí ve tøídì `%s' býtznak ve tøídì `%s' není?Neúspì¹nì ukonèen (SIGABRT)Pøístupová práva: Pou¾ití po¹kozené sdílené knihovnyAdresa ji¾ je u¾ívánaTøída adres není poèítaèem podporovánaTøída adres není protokolem podporovánaChyba pøi zveøejnìníBudík (SIGALRM)Pøíli¹ dlouhý seznam argumentùPokus o odstranìní neprázdné tabulkyPokus o pou¾ití pøíli¹ mnoha sdílených knihovenOvìøení toto¾nosti bylo úspì¹néOvìøení toto¾nosti bylo neúspì¹néPOCHYBNÝ OBJEKT +-Chybná adresaChybný deskriptor souboruChybný formát fontuChybná zprávaChybné volání systému (SIGSYS)Chybná hodnota ai_flagsPøesný soulad s POSIXBiná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)CDSPøekroèen èasový limit pro procesor (SIGXCPU)®ivotnost cache vypr¹elaK potøebné sdílené knihovnì nelze pøistoupitK serveru obsluhujícímu tuto doménu se nelze pøipojitS portmapperem nelze komunikovatS ypbind nelze komunikovatS ypserv nelze komunikovatNelze alokovat pamì»Po¾adovanou adresu nelze pøiøaditSoket pro v¹esmìrové rpc vysílání nelze vytvoøitSdílenou knihovnu nelze pøímo spustitVíce ne¾ jeden pøíznak tvorby souboru nelze pou¾ít! +-Odpovìï na v¹esmìrové vysílání nepøi¹laSlu¾bu nelze registrovatSpojení bylo pøeru¹enoV¹esmìrový paket nelze poslatVolbu SO_BROADCAST pro soket nelze nastavitVí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ý rozsahOddì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 farmuVý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ítnutoSpojení zru¹eno druhou stranouSpojení 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øitVytvoøí 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í : %sDES záznam pro sí»ové jméno %s není jednoznaèný +-ADRESÁØ +-DNANSDNSDatabáze pro tabulku neexistujeDatabáze ji¾ je pou¾ívánaImplicitní pøíst. práva : +-Cílovou adresu je nutné zadatZaøízení není proudZaøízení není nakonfigurovánoZaøízení nebo zdroj ji¾ jsou pou¾íványDiffie-Hellmann (bitù: %d) +-Adresáø : %s +-Adresáø není prázdnýPøekroèena disková kvótaNespou¹tí samostatný proces a vypisuje zprávy na aktuálním termináluBìhem tvorby databáze nevypisuje zprávyNepou¾ívá existující katalog, vytvoøí nový výstupní souborDoména není pøipojenaEMT past (SIGEMT)ZÁZNAM +-©ifrovaná data +-Nesoulad záznamu s tabulkouChyba v subsystému RPCChyba 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øediskoChybný formát spustitelného souboruFATÁLNÍ CHYBA: systém nedefinuje `_POSIX2_LOCALEDEF'SOUBOR obsahující mapování symbolických názvù na UCS4 hodnotyChyba (blí¾e nespecifikovaná)Deskriptor souboru se nachází v chybném stavuSoubor ji¾ existujeVzájemné zablokování pøi zamykaní souboruPøíli¹ dlouhé jméno souboruPø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 resynchronizaciFunkce není implementovánaSKUPINA +-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émuZí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ìduDobrovolná chybaSkupina : %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 provozuNázev poèítaèe se nepodaøilo naléztVstup/Výstup mo¾ný (SIGIO)VSTUPNÍ_SOUBOR VÝSTUPNÍ_SOUBOR +--o VÝSTUPNÍ_SOUBOR VSTUPNÍ_SOUBOR +--u VSTUPNÍ_SOUBORIOT past (SIGIOT)IVYIdentifikátor odstranìnNedovolená instrukce (SIGILL)Nedovolený typ objektu pro operaciNedovolené nastavení poziceNevhodný typ nebo formát souboruPro toto zaøízení nevhodné ioctlNevhodná operace pro proces na pozadí®ádost o informaci (SIGINFO)Informace:Vstupní soubory:Zadání vstupnì/výstupního formátu:Chyba vstupu/výstupuVnitøní chyba NISVnitøní chyba ypbindPøeru¹ení (SIGINT)Pøeru¹ené volání systémuPøeru¹ené volání systému by mìlo být znovu spu¹tìnoPro operaci neplatný objektNepøípustný argumentNeplatný zpìtný odkazNepøípustný název tøídy znakùNeplatné oprávnìní klientaNeplatné ovìøení klientaPro øazení nepøípustný znakNepøípustný obsah \{\}Odkaz mezi zaøízeními není pøípustnýNepøípustná výmìnaNepøípustný nebo nekompletní vícebajtový nebo ¹iroký znakNepøípustný pøedchozí regulární výrazNepøípustný konec rozsahuNepøípustný regulární výrazNeplatný kód ¾ádostiNepøípustný deskriptor ¾ádostiNeplatné ovìøení serveruNeplatný slotje adresáøemje soubor zadaného typuKerberos. +-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í hodnotyOdkaz odkazuje na nedovolený názevOdkaz byl znièenÈíslo odkazu mimo rozsahTyp odkazovaného objektu : Odkazuje na : %s +-Jméno místní domény není nastavenoChyba pøi pøidìlování místních prostøedkùPoèítaè není v sítiChybnì 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ánaPøíli¹ dlouhá zprávaChybìjící nebo chybnì formovaný atributÈas zmìny : %sZmìna nebyla provedenaOperace zmìny nebyla provedena úspì¹nìZmìna výstupního formátu:Pokus o spojení pøes více uzlùNÁZEVNÁZEV +-[-a|-m]NISRozdílné verze NIS klienta a serveru - slu¾bu nelze poskytnoutNIS 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ÈETNázev : '%s' +-NSC (Name Service Cache) démon.Jméno není tímto serverem obsluhovánoJméno v síti není jednoznaènéNeznámé jméno nebo slu¾baJméno/záznam nejsou jednoznaènéPojmenovaný objekt není prohledávatelnýJe tøeba ovìøovaèeSí» zru¹ila spojení (problém se vzdáleným poèítaèem)Sí»ování je mimo provozSí» není dostupnáCSI struktura není dostupnáXENIX semafory nejsou dostupnéJméno poèítaèe nemá pøiøazenu adresuJméno nemá pøiøazenu adresu®ádný anodePro V/V vyrovnávací pamì» není volná pamì»®ádný potomek neexistujeData nejsou k dispoziciNa serveru není místo pro souboryZámky nejsou k dispozici®ádná shodaMédium nebylo nalezeno®ádná zpráva ¾ádaného typu®ádné dal¹í záznamy v map databáziPøedchozí regulární výraz neexistuje®ádné vzdálené programy nejsou registrovány. +-K poèítaèi neexistuje cestaNa zaøízení ji¾ není volné místoTakové zaøízení neexistujenení souborem ani adresáøemTento klíè v mapì neexistujeTato mapa se v doménì serveru nenacházíTento proces neexistujeSpatøen prostor názvù mimo NIS+Neopravitelná chyba pøi vyhodnocení názvu®ádný. +-Nebylo nalezeno, takové jméno neexistujeNejde o pojmenovaný XENIX soubornení adresáøemNebylo nalezenoNení hlavní server pro tuto doménuNení vlastníkemPoèet sloupcù : %d +-Poèet objektù : %u +-Èíselný rozsah mimo definièní obor funkceÈíselný výsledek mimo rozsahObjekt #%d: +-Název objektu : %s +-Typ objektu : Objekt je vzdálenýObjekt se stejným názvem ji¾ existujeLichý poèet uvozovekTento pøepínaè je dostupný pouze superu¾ivateli!Operace ji¾ probíháOperace není povolenaOperace není podporovánaOperace probíháOperace byla pøeru¹enaJi¾ nejsou volné proudyØízení výstupu:Výbìr výstupu:Vlastník : %s +-SOUKROMÝ +-Balík není nainstalovánChyba analýzy: %sÈásteèný úspìchDo¹lý objekt není na serveru tímté¾ objektemPøístup odmítnutVýpadek napájení (SIGPWR)Pøedèasný konec regulárního výrazuVypí¹e obsah databázového souboru, jeden záznam na øádekVypí¹e statistiky aktuální konfiguraceVypí¹e více informací o prùbìhuVypí¹e oznaèení verze programuPravdìpodobnì úspìchPravdìpodobnì nebylo nalezenoProfilovací èasovaè vypr¹el (SIGPROF)Ovladaè protokolu nepøipojenChyba protokoluRodina protokolù není podporovánaProtokol není k dispoziciProtokol není podporovánProtokol nepodporuje soketyZakázaná otázka pro danou tabulkuKonec (SIGQUIT)RFS-specifická chybaChybná RPC procedura pro programSelhal RPC pøi NIS operaciRPC program není k dispoziciChybná verze RPC programuRPC struktura je chybnáChybná verze RPCRPC: (neznámý chybový kód)RPC: Chyba pøi ovìøování toto¾nostiRPC: Výsledek nelze dekódovatRPC: Argumenty nelze zakódovatRPC: Chyba (blí¾e neurèená)RPC: Nekompatibilní verze RPCRPC: Chyba portmapperuRPC: Procedura není k dispoziciRPC: Program není registrovánRPC: Program není k dispoziciRPC: Nesouhlasí program nebo verzeRPC: Chyba vzdáleného systémuRPC: Server nemù¾e dekódovat argumentyRPC: ÚspìchRPC: Èasovaè vypr¹elRPC: Nelze pøijmoutRPC: Nelze vyslatRPC: Neznámý poèítaèRPC: Neznámý protokolRSA (bitù: %d) +-RTLD_NEXT je pou¾ito pro kód, který není dynamicky zavedenPøeètení a vypsání profilovacích dat sdíleného objektu.Naètení údajù o konfiguraci ze souboru NÁZEVSystém souborù je pouze pro èteníReal-timeový signál %dRegulární výraz je pøíli¹ velkýChyba vstupu/výstupu na vzdáleném poèítaèiVzdálená adresa byla zmìnilaOdstraò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 (èesky). +- Chyby v programu oznamujte pomocí skriptu `glibcbug' na adresu +-(pouze anglicky), pøipomínky k pøekladu zasílejte na (èesky). +-Chybné argumenty ¾ádostiResolver vrací stav 0 (bez chyby)Vnitøní chyba resolveruBylo zabránìno vzájemnému zablokování prostøedkùProstøedek byl ztracenProstøedek je doèasnì nepøístupnýVýsledky zaslány proceduøe zpìtného voláníSDÍLENÝ_OBJEKT [PROF_DATA]SUNYPProhledávací cesta : %s +-Neoprávnìný pøístup do pamìti (SIGSEGV)Server je zaneprázdnìn, zkuste to znovuPamì» serveru byla vyèerpánaServer odmítl oprávnìníServer odmítl ovìøeníJméno serveru není pro ai_socktype podporovánoNastaví název programuZastavení serveruSignál 0Soketová operace na objektu, který není soketemTyp soket není podporovánSoftware zpùsobil ukonèení spojení (abort)Lituji, nejste superu¾ivatel +-Naète zdrojovou definici národního prostøedí ze SOUBORuChyba srmountPoru¹en zásobník (SIGSTKFLT)"Zastaralý odkaz na NFS souborSpustí POÈET vlákenStav : %s +-Pozastaven (SIGTSTP)Pozastaven (SIGSTOP)Pozastaven (tty input) (SIGTTIN)Pozastaven (tty output) (SIGTTOU)Chyba proudové rouryStruktura potøebuje opravuÚspìchPotlaèí varovné a informaèní zprávySymbolické názvy znakù budou èteny ze SOUBORu (znakové sady)Chyba systémuSysté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 +-%sTABULKA +-Typ tabulky : %s +-Doèasná chyba pøi vyhodnocování jménaUkonè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¹elPøí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¾ivatelePøíli¹ mnoho odkazù - nelze spojitPøíli¹ mnoho u¾ivatelùTrasovací/ladící past (SIGTRAP)Koncové zpìtné lomítkoPøekladatel zemøelKoncový komunikaèní bod je u¾ pøipojenKoncový komunikaèní bod není pøipojenVí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ìøitToto¾nost NIS+ serveru nelze ovìøitZpìtné volání nelze vytvoøitNa serveru nelze vytvoøit procesNeznámý (typ = %d, bitù = %d) +-Neznámé klíèové slovo v .netrc: %sNeznámý chybový kód slu¾by NISNeznámá databáze: %s +-Neznámá chybaNeznámá chyba Neznámý poèítaèNeznámý objektNeznámá volba: %s %s %sNeznámá chyba resolveruNeznámá chyba serveruNeznámý signál %dNeznámá chyba systémuNeznámá chyba ypbindNepá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ý typVirtuální èasovaè vypr¹el (SIGVTALRM)Vykonaný pøíkaz dal podivný výsledekOkno se zmìnilo (SIGWINCH)Vypsání názvù dostupných znakových sadVypsá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 slovZapsání výstup do souboru SOUBORAutor: %s. +-Chybný typ médiaX500XCHSYPBINDPROC_DOMAIN: %s +-Ano, 42 je smysl ¾ivotaTentokrát jste to skuteènì zvoralKoncový è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ý znakai_family není podporovánai_socktype není podporovánji¾ bì¾íargument pro <%s> musí být jednoznakovýargument pro `%s' musí být jednoznakovýauth_none.c - Fatální chyba marshallinguauthunix_create: nedostatek pamìti +-chybný argumentchybný vlastníkprázdná polo¾ka OD v øádku Linkprázdná polo¾ka DO v øádku Linkblok 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ìticache_set: ne¹lo alokovat vyrovnávací pamì» pro rpccache_set: alokace nové polo¾ky cache se nezdaøilacache_set: obì» nenalezenazkratku è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 alokovatinterní deskriptor nelze vytvoøitinterní deskriptory nelze vytvoøitsoket nemù¾e pøijímat spojení: %spreprocesor jazyka C nelze nalézt: %s +-¾ádný preprocesor jazyka C (cpp) nelze nalézt +-¾ádost staré verze (%d) nelze zpracovat; aktuální verze je %dprvek øazení `%.*s' nelze vlo¾itdo výsledné tabulky nelze vkládatnový symbol øazení nelze vlo¾it: %sprofilovací data nelze naèístnelze otevøít`%s' nelze otevøítdatabázový soubor `%s' nelze otevøít: %svstupní soubor `%s' nelze otevøítsoubor `%s' definice národního prostøedí nelze otevøítvýstupní soubor nelze otevøítvýstupní soubor `%s' nelze otevøítvýstupní soubor `%s' pro kategorii `%s' nelze otevøítsoket nelze otevøít: %szadané poøadí øazení nelze zpracovatadresáø `%s' znakových sad nelze naèístkonfiguraèní soubor nelze naèíst (fatální)od klienta nelze èísthlavièku ze souboru `%s' nelze pøeèístadresáø `%s' národních prostøedí nelze naèístsoubor `%s' národního prostøedí nelze èístrepertoár znakù `%s' nelze èíststatistické údaje nelze naèíststat() nelze na soubor `%s' vykonat stat(): %svýstupní soubory nelze do `%s' zapsatvýsledek nelze zapsat: %sstatistiku nelze zapsat: %ske klientovi nelze zapisovatúdaje kategorie po¾adovány více ne¾ jednou - to by se nemìlo státznak %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 není ve znakové sadì definovánznak `%s', potøebný jako implicitní hodnota, není definovántøída znakù `%s' ji¾ je definovánaznaková sada `%s' ji¾ je definovánasoubor `%s' znakové sady nebyl nalezenclnt_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ánsymbol øazení `%.*s' uveden více ne¾ jednou - øádek ignorovánpo `%s' je oèekáván symbol øazenípøipojení na adresou %s: oèekávána konstanta nebo identifikátorkonverze z `%s' do `%s' není podporovánakonverze zastavena kvùli problému pøi zápisu výstupurpc server nebylo mo¾no vytvoøit +-program %d verze %d nebylo mo¾no zaregistrovat +-databáze [klíè ...]implicitní soubor `%s' znakové sady nebyl nalezenpøí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 sadyduplicitní oznaèení èasového pásma %s (soubor "%s", øádek %d)duplicitní identifikátor zprávyduplicitní èíslo zprávyprázdný znakový øetìzecprázdný váhový název - øádek ignorovánenablecache: cache ji¾ je povolenaenablecache: cache nebylo mo¾no alokovatenablecache: nebylo mo¾no alokovat místo pro data v cacheenablecache: nebylo mo¾no alokovat frontu pro cachevýstupní kódováníkódování vstupního textukoncový 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 souboruchyba bìhem uzavírání souboru profilovacích datchyba bìhem vkládání prvku øazení do ha¹ovací tabulkychyba bìhem vkládání do hashovací tabulkychyba bìhem ètení vstupujako argument pro `copy' oèekáván øetìzecoèekávaný pokraèovací øádek nebyl nalezensdílený objekt `%s' se nepodaøilo zavéstdata symbolù se nepodaøila naèístsoubor profilovacích dat se nepodaøilo mmap-ovatkonverze se nezdaøilachyba bìhem zápisu dat kategorie `%s'fcntl: F_SETFDpolo¾ka `%s' kategorie `%s' není definovánapolo¾ka `%s' kategorie `%s' není definovánasoubor '%s' ji¾ existuje a mohl být pøepsán +-hodnota z-èeho pro `collating-element' musí být øetìzecfunkce fstat() skonèila s chybousmetí na konci specifikace kódu znakusmetí na konci èíslasmetí 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 tikyget_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 Leapchybná polo¾ka Rolling/Stationary na øádku Leapnepovolený znak v øetìzcinepovolený znak v souboru: nepovolený prvek øazenínepovolená definicezadáno nepøípustné kódováníchybná escape-sekvence na konci øetìzcenepovolená vstupní sekvence na pozici %ldnepovolené názvy pro rozsah znakùnepovolený nettype: '%s' +-chybná hodnota posunutí v øetìzci (%d) polo¾ky `era' kategorie `%s'nepovolené èíslo sadyneplatné 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 %dimplementaèní omezení: maximální poèet znakových sad je %dnekompletní znak nebo shift sekvence na konci vyrovnávací pamìtichybnì formátovaný souborvstupní øádek neznámeho typuvnitøní chyba (nepøípustný deskriptor)vnitøní chyba - addtype volán s chybným isdstvnitøní chyba - addtype volán s chybným ttisgmtvnitøní chyba - addtype volán s chybným ttisstdvnitøní chyba ve funkci %s na øádku %uneplatné posunutí vùèi UTCneplatný formát zkratkyneplatný den mìsíceneplatný koncový rokneplatný pøestupný rokneplatný mód pro dlopen()neplatný název mìsíceneplatný ulo¾ený èasneplatný poèáteèní rokneplatný denní èasneplatný název dnedé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é sadysoubor `%s' národního prostøedí pou¾itý v pøíkazu `copy' nebyl nalezenfunkce lstat() skonèila s chyboudeformovaný øádek - ignorovánchyba pøi mapování tabulky øetìzcù z hlavièky sekce do pamìtichyba pøi mapování hlavièek sekcí do pamìtipamì» 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ánapamì» 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 érybezejmenné pravidlopùvodní ani cílové kódování není zadánonetname2user: (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 0dosud neregistrovaný program (%d) +-hodnota nebo nebyla zadánav polo¾ce `%s' v kategorii `%s' není korektní regulární výraz: %spravidlu nevyhovuje ¾ádný den v mìsícichybí definice symbolu `UNDEFINED'název souboru pro profilovací data nebyl zadán a sdílený objekt `%s' nemá sonamepøi pou¾ití `copy' není dovoleno pou¾ít ¾ádné jiné klíèové slovový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ánosymbol `%s' nemá definovanou váhunení obyèejným souboremkonfigurace nscd: +- +-%15d ladící úroveò serveru +-nscd nebì¾í! +-definici CHARMAP mohou následovat pouze definice WIDTHpùvodní kódování nebylo pomocí `-f' zadánovýstupní souborpmap_getmaps problém s rpcpoll: chyba protokolu bìhem pøípravy okruhu +-chyba preprocesoruvypí¹e seznam symbolù a poèet jejich pou¾itívypisuje informace o prùbìhuproblé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ánasoubor `%s' repertoáru znakù nebyl nalezenrpcgen: 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 spojitstejné jméno pravidla je pou¾ito ve více souborechneúplné ètení klíèe ¾ádosti: %sneúplné ètení ¾ádosti: `%s'neúplný zápis v %s(): %ssoket: 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ýznamstandardní vstupstandardní výstupnepovolené 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 chybousvc_tcp.c - pøi getsockname nebo listen vznikla chybasvc_tcp.c - pøi vytváøení tcp soketu vznikla chybasvc_tcp: makefd_xprt: nedostatek pamìti +-svc_unix.c - pøi vytváøení AF_UNIX soketu vznikla chybasvc_unix.c - pøi getsockname nebo listen vznikla chybasvc_unix: makefd_xprt: nedostatek pamìti +-svctcp_create: nedostatek pamìti +-svcudp_create - pøi getsockname vznikla chybasvcudp_create: nedostatek pamìti +-svcudp_create: soket nelze vytvoøitsvcunix_create: nedostatek pamìti +-symbol pro víceznakový prvek øazení `%.*s' duplikuje definici prvkusymbol pro víceznakový prvek øazení `%.*s' duplikuje jiný prveksymbol pro víceznakový prvek øazení `%.*s' duplikuje definici jiného symbolusymbol pro víceznakový prvek øazení `%.*s' duplikuje definici symbolusymbol pro víceznakový prvek øazení `%.*s' duplikuje symbolické jméno ve znakové sadìsyntaktická chyba v definici %s: %ssyntaktická 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_CTYPEsyntaktická chyba v definici nové tøídy znakùsyntaktická chyba v definici nové znakové sadysyntaktická chyba v definici národních zprávsyntaktická chyba v definici národního prostøedí pro penì¾ní údajesyntaktická chyba v definici národního prostøedí pro èíslasyntaktická chyba ve specifikaci poøadísyntaktická chyba v prologu: %ssyntaktická chyba v definici repertoáru znakù: %ssyntaktická chyba v definici národního prostøedí pro èassyntaktická chyba: není uvnitø sekce pro definici národního prostøedíkódování cíle nebylo pomocí `-t' zadánototo je první definiceèas men¹í ne¾ nulapøeteèení èasuv 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øídpøíli¹ mnoho pøestupných sekundpøíli¹ mnoho lokálních èasových typùpøíli¹ mnoho pøechodù?!pøíli¹ mnoho vahpøíli¹ mnoho nebo pøíli¹ dlouhé zkratky èasového pásmasmetí na konci øádkuproblémy pøi odpovídání programu %d +-dva øádky za sebou obsahující `...' nejsou povolenyzadán jeden rokvyrovnávací pamì» pro vstup nelze alokovatargumenty nelze uvolnitnení definovánoneznámý znak `%s'neznámý znak v polo¾ce `%s' kategorie `%s'neznámá direktiva øazeníneznámá direktiva `%s' - øádek ignorovánneznámá chyba funkce iconv() (%d)neznámá sada `%s'neznámý symbol `%.*s' - øádek ignorovánèasové pásmo bez pravidelneukonèená zprávaneukonèený øetìzecneukonèený øetìzecneukonèené symbolické jménoescape sekvence není celáhorní mez rozsahu je men¹í ne¾ dolníPou¾ití: %s vstupní_soubor +-pou¾ití 29. února v nepøestupném rocehodnota pro %s musí být celé èíslohonota pro <%s> musí být mezi 1 a 4hodnota polo¾ky `%s' kategorie `%s' nesmí být prázdný øetìzechodnota musí být vìt¹í ne¾ hodnota hodnota polo¾ky `int_curr_symbol' kategorie `LC_MONETARY' neodpovídá platnému jménu v ISO 4217hodnota polo¾ky `int_curr_symbol' kategorie `LC_MONETARY' má chybnou délkuhodnoty polo¾ky `%s' kategorie `%s' musí být men¹í ne¾ 127bìhem pøijímání spojení: %sbìhem alokace záznamu cache pamìtibìhem alokace záznamu ha¹ovací tabulkybìhem alokace kopie klíèebìhem otvírání starého katalogubìhem pøípravy výstupubìhem ètení databázebìhem funkce stat() na soubor profilovacích informacíbìhem zápisu databázeneúplný zápiszapisovatelný nejen pro vlastníkachybný 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 Zonexdr_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 @@ +-Þ•Úì'¼=XRYRlRMREÍR&S(:ScStSŒSžS­SÁSÜSöSn +-TyU‹U"U"ÀUãU:ÿU:VCVLVbVyV“VªVÄVÝVùVW.WHWeW}W›W¢W ½WÊWÑW3ãW3X4KX.€X%¯XÕX&éX%Y6Y%MY3sY,§Y)ÔYþY"Z!:Z\ZsZŒZ¦ZÀZÖZéZ*ÿZ*[&D[&k[&’[&¹[&à[\ \$@\e\€\š\,´\á\%ÿ\,%]-R] €]&¡]È]ç]^ ^;^[^‰{^2_8_"X_4{_°_#Â_ æ_=ð_.`<?`|`'œ`Ä`)Í`(÷` aAaCaKa$\aa)˜a(Âa/ëab +b7bLb^bub#Œb=°b/îbc0c Ec Sc_cwc‹c›c °c¼cÍcäcôc d %d2dHd _d kdudyd ‘d&Ÿd&Æd-íd!e=e[eyee&°e%×e0ýe!.fPf!hf-Šf¸f%Õf)ûf'%g%Mg&sgšg¶g ÐgÝgøgh+hHh@ahD¢hçhúhi (i=2ipiÇŠiRj7qj2©j-Üj +-kk$/k +-Tk_kek!ik‹k#œkÀkÙk ökll,lDl_lsl‡l›l3¯l-ãl2mDmUm^memumm —m ¡m «m µm ¿m Ém Óm Ým çm ñm ûm n n n #n -n 7n An Kn Un _n insn|n…nŽn—n n©n²n»n<Òno$/o)To ~oŒo1žoÐo8Õop)p FpRphp„p—p°pÄpÓpëp"q'q@qGqŽdqóq r)rDrXrir }r‹r$«rÐr"×r%úr" s"Cs%fs Œs™s ²s ¼s>Ésttt(t>t!Rt tt!t£t.Âtñt u u"uBuUuhu ~uˆu+ uÌuÝuôuv+vCv_vwv‘v¢v1¿v$ñvw(wCwXwsw ‹w˜w·wÆwÕw +-êwõwüw2x5xDx]x lxzxx©xÅxÛxëx!y'yEyseyÙy*êyz/z@zTzez„z—z«zÃzÙzìz ñzþz9{<{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Œ…Œ™Œ®ŒÁŒÚŒ*âŒ( 6C"WƒzþŽ ŽŽ$/Ž +-TŽ_Ž«nŽ *8!Ln}‘¯"Âåô +-‘‘'-‘#U‘6y‘ °‘ +-¾‘É‘"Ñ‘"ô‘’"1’T’t’Ž’¥’ »’É’ Ø’å’ô’ “$“9“K“`“u“‡“™“ «“¸“Ó“è“#ï“:” N”o”…”%›”Á”"×”ú”! • +•"L• o••ª•º•Ì•Ñ•Ö•í• –F)– p–4z–.¯–-Þ–6 —8C—;|—I¸—˜˜4˜+D˜+p˜'œ˜Ę ä˜ ñ˜û˜™5™&H™.o™&ž™Å™,Õ™š!šC=š#š¥šÄš!àš"›.%› T›%u›;››&×›þ›1œPœ kœwœ"ˆœ«œ'Çœïœ.$S"j(-¶äü!ž;žXžxž”ž!°žÒžêžŸ9Ÿ2WŸ6ŠŸ+ÁŸ?íŸC- 8q $ª "Ï !ò .¡C¡b¡¡<¡¡;Þ¡$¢?¢W¢*w¢7¢¢Ú¢"ù¢£)/£NY£U¨£þ£&¤)C¤ m¤{¤+”¤À¤Þ¤ø¤ +-¥"*¥%M¥*s¥*ž¥É¥Ý¥0÷¥(¦E¦d¦+„¦7°¦#è¦ §!*§$L§!q§“§&®§%Õ§,û§(¨%7¨0]¨2Ž¨ Á¨.Ψý¨K©Lb©L¯©ü©+ª2<ª2oª/¢ª$Òª÷ª% «-3«$a«†«¢«¼«Ï«(æ«&¬!6¬X¬Fo¬¶¬BɬB ­?O­<­7Ì­®®#:®.^®0®0¾®ï® ¯ ¯<¯Q¯e¯z¯”¯§¯º¯Яä¯#ù¯5°GS° ›°#©°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#¾Oy¾Vɾ! ¿'B¿*j¿/•¿*Å¿$ð¿/À1EÀ/wÀ)§À*ÑÀ)üÀ#&ÁJÁ-eÁ&“Á4ºÁ(ïÁÂ5 FÂ#TÂ$xÂ"ÂÀÂÖÂðÂÃ.ÃGÃgÃ3„øÃ#ÊÃîà ÄÄ0(ÄYÄ$uĚijÄ#ÄÄ èÄôÄ ÅÅ:ÅUÅ4nţŵÅÒÅ'òÅBÆD]Æj¢ÆK Ç?YÇ ™Ç£ÇÂÇ!ßÇÈÈ:ÈQÈ"hȋȧȸÈÖÈ#ðÈ#É#8É0\É#ɱÉÏÉ*íÉ%Ê(>ÊgË{ËTËPäË35Ì4i̞̱ÌËÌßÌðÌÍ"Í<ÍžPÍïÎÏ0Ï0OÏ€ÏNŸÏ +-îÏùÏÐÐ 6ÐWÐ rÐ “Ð&´Ð ÛÐ&üÐ #Ñ&DÑkцѤÑ!­Ñ ÏÑÜÑåÑ7øÑ70Ò>hÒ1§Ò)ÙÒÓ/Ó,OÓ|Ó0—Ó6ÈÓ3ÿÓ03Ô!dÔ1†Ô-¸Ô)æÔ Õ@1Õ-rÕ% ÕÆÕ)áÕ: Ö*FÖ(qÖ(šÖ(ÃÖ(ìÖ(×>×-V×/„×6´×)ë×Ø,3Ø(`Ø+‰Ø,µØ-âØ+Ù/<Ù)lÙ#–ÙºÙ$ÚÙÿÙÚ‘;Ú2ÍÚ'Û'(Û>PÛÛ3¥ÛÙÛEìÛ2ÜBDÜ2‡Ü+ºÜ æÜ;óÜ?/Ý9oÝ©Ý «Ý·Ý8ÈÝ"Þ5$Þ@ZÞ@›ÞÜÞøÞ ß)ßGß3eß,™ß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Éí@îIQî!›î½îÆîÍî9ãîï +-&ï +-1ï +-<ï +-Gï +-Rï +-]ï +-hï +-sï +-~ï +-‰ï +-”ï +-Ÿï +-ªï +-µï +-Àï +-Ëï +-Öï +-áï +-ìï +-÷ï +-ð +- ð ð "ð ,ð 6ð @ð Jð Tð ^ðhðH‚ð%Ëð6ñð:(ñcñ"}ñI ñêñ>ðñ4/ò5dòšò¶òÕòôò)ó'8ó`ó,vó£óC·ó1ûó-ô$4ôµYôõ&(õ!Oõqõ†õ—õ«õ(ºõ/ãõ ö(ö+Fö(rö'›ö+Ãöïö# ÷/÷B÷F[÷¢÷º÷¾÷Ø÷í÷4ø=ø1Rø-„ø.²øáø õøù'ù:ùQùeù ù/ùB¿ùúú&6ú(]ú!†ú¨úÂú)ßú û%û<Dû2û4´ûéûüü!;ü]ü#mü‘ü¥ü»ü +-ÖüáüéüKïü;ý Nýoý‚ý˜ý4²ý,çýþ.þ,Aþ-nþ4œþ!Ñþ”óþˆÿE™ÿ'ßÿ!)I$cˆ›"·Úö &H**sž%¼:â * 1>/Y(‰*²)Ý*28I9‚¼!Ùû (;$d ‰+•ÁÕ4ë 8W$l)‘6»!ò0E3a•9³%í#,7dƒ. Ï×ö(;Q a‚!‘#³×ð  t4 >© <è  % +-2 +-F +-W +-0m +-%ž +-:Ä +-%ÿ +-% !D f $† ;« &ç  /- &] &„ « ½ Ï ã &ë  $ >: y Œ *ª <Õ +>Xt0­!Þ+!<$^&ƒ8ª ãí(#.R#p”³È%æ' &43[,¼Øö#4"X/{«¼Öð ;CJ@ŽÏï!")D'nC–5Ú &AA#ƒ)§$Ñö5"J*m˜,±Þïõ<&+c--½2ë7I&R!y3›HÏ/H Y!e ‡¨ +-ÀËßø!'I1P>‚ ÁÎ0⃗Ÿ +-¨³)Í÷?ÿ¸?ø'0&Cjy!‘³!Åçù0 Mn:È Ú ä7î7& 0^ 3  à 4ä !4!N!a!u!‰!œ!"¸!Û!ú!")"&H"#o"&“"º"Ø"ñ"#$#O>#/Ž#¾#Û#1ø#'*$*R$ }$-ž$*Ì$.÷$4&%&[%‚%™%­%²%·%MÎ%)&`F& +-§&?²&Bò&25'Ch'B¬'@ï'S0("„("§(Ê(6à(3)+K))w)¡)»)"Ñ) ô)**<@*<}*8º*ó*<+*?+)j+X”+1í+5,6U,(Œ,)µ,Hß,*(-(S-C|--À-*î-8.$R.w..+¬.'Ø.2/"3/'V/>~/ ½/?Þ/K07j0¢0$¾0,ã0&1*71b17‚1*º1%å1& 222VR2p©2^3@y3}º3k84H¤4,í465;Q5:5(È5(ñ5)6UD6Tš6-ï6"7"@77c7?›7 Û77ü748JN8g™8k91m9-Ÿ9)Í9÷9 :/%:0U:,†:³::Æ:$;&&;/M;+};©;%Ã;=é;7'<+_<'‹<7³<=ë<()=R=,p=3=)Ñ=!û=4>#R>6v>­>:¼>9÷>:1?.l?,›?(È?dñ?cV@bº@A::A=uA7³A4ëA@ BaB0|B8­B.æB!C7CQCfC1„C+¶C&âC DZ$DDQ–DPèDK9EH…E<ÎE F.&F'UFI}FKÇFKG+_G‹G¡G½G×GìGHH5HQHhH#|H6 HN×HM&ItI.ŠIO¹I- J 7J?XJ2˜J;ËJGK!OKEqKQ·KO LYL9iL £LJÄLLM.\M1‹M5½M&óM,NOGN.—N ÆN\çNSDOE˜O:ÞO P=:P<xPµP.ÊPùPF Q4SQ ˆQ•Q+®Q$ÚQCÿQ1CRuRD’R%×R8ýR.6S7eS.S8ÌS%T+T4KT+€T¬T*ÆT*ñTNU*kU,–U0ÃU5ôU *VKV-dV;’VJÎVW)WT9W+ŽW-ºW.èWVX%nX5”X6ÊX.Y;0Y6lY/£Y'ÓY,ûY'(Z5PZ(†ZV¯Za[Zh[€Ã['D\+l\,˜\4Å\5ú\-0]7^]8–]8Ï]@^AI^@‹^>Ì^ _2&_AY_<›_2Ø_ ` )`7`'I`&q`!˜`º`Ò`é`þ`0a%Ha3na<¢aßa2üa5/bebub5Žb Äb4åbc8c4Mc‚c%—c½cÝc'ýc0%dCVdšd9³d(íd5eHLeK•eráeWTfM¬f úf g$%g8Jg$ƒg"¨gËgèg<h!>h.`hAhÑh+îh+i+Fi<ri+¯i'Ûi'jB+j5një:cŽ +-ý}ùŒH8 ¯¨1ÉÔ†˜ûC¡Úô ¨VÃRVzØï­Ða©m+í +-ü  k¯ÜˆOFœÕ•–8MDNf4Ar¼ÊXǤš©qŽv5ÀQV\FBÛ©³£Ú|øÂ4ä¥ÏÅ>–¹$]$«çIJChÑq×\u±"Mïõƒ™ö†hÐM]èòÓpsGß“Nãe@­¦ýwò <_þB™ý‡³vÓ=G±´G„)) 1&‰@õ¬P6¶3L·W<àŠ!7Ö¸¾ÐŒ™Uç.Ôr›SÔ:<gžsø" Æð0A4#ÚEuØê÷aŸQͦ9~`XÀÊ5¬`c‹2‡4þ«&Ç€Ì(9Î>ÍÈK¦{ü‘/[´º”Ã+„hÄ!‘îl<AgŸ ìšN•ÙB’Xª¤6º*oëÅžþôR¥-Ißa‚ª9:ˆâŠ»…Ò8ñ«Çe Ÿ°¡Zió(Î6‚…°(Þ¢SÊ>,i²‹»wÑfÑ@F̤y0J¬nÎåœ|×Úm;Xpx-5³%wH:»Í¿œ1#7‰ÙW¸¿Ÿ?ËÕ­/a[TáFDŠ3·Ïk'Er}~ ,Ä*nÖWçú9'ª.CØÏ0˜O\ 2f^Âb·3÷«%-#\j›v Ä”2e²u;y¡Ð¶’=·kn•÷ø»Oœ®]tL“Dš¶dz‘úÆP…itˆ)P" ð=ÔRáfÞÁ[Zæ?ŒZD½éTÀñòèÿéÁãÉ{ùkÿ žÀûËÇŠóôTö_®§ c±¿H¯ZKÝsÕ™ìpÝäɇ]±ª+ÈÖgz`0o½›³B|L%^ƒp*{"§xϦ£Y´>¹È!£y;U”@Ñ7§Yx“.Lö‡½lÆ,Q[hêvbúÁ ÆÓY˨µI‰/®5/²ÍƒiK—%;¢_›Êr#1º½s§åU8eõÂm} à=€2?˜Ö*˜šu®ÿz„•¥¬$ÁJ^¼¤ c¶$JùIÅt’ È¾&mGØÒÉS¹ +-¢ ñ×do¼'€°VEt_¸Ä¯Ü€ +-UÅ©M¢x~²†—µdA. ×yŒÛÜÝÞßàáâTä­þ!ÕÙ—7gµ+ÌjÓ,—(Kb)°qS3‘”Ëåæ‰èéêëìíîWŽN´ºÎEOüµˆàwã`ïob{|‹6¨q&†Hl‚ó}Ž„j£Ò¹Ìâû¸¿ ’CÛ¡d‹¥jl-‚P…“nRÒæ~¾–ð¼^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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAddress family not supported by protocol familyAdvertise errorAlarm clockAnode table overflowArg list too longArgument list too longArgument out of domainAttempt to remove a non-empty tableAttempting to link in more shared libraries than system limitAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad exchange descriptorBad file descriptorBad file numberBad font file formatBad messageBad request codeBad request descriptorBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan not exec a shared library directlyCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after socket shutdownCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sCross-device linkDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDeadlock situation detected/avoidedDefault Access rights : +-Destination address requiredDevice busyDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDisk quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/table type mismatchError 0Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 136Error 142Error 58Error 59Error 72Error 73Error 75Error 76Error 91Error 92Error in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILEFILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlockFile locking deadlock errorFile name too longFile size limit exceededFile table overflowFile too largeFirst/next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O errorI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal byte sequenceIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid object for operationInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotInvalidate the specified cacheIs a directoryIs a name fileIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink has been severedLink number out of rangeLink points to illegal nameLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed name, or illegal nameMandatory 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 failureMemory exhaustedMessage tables fullMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : `%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection because of resetNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo record locks availableNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such device or addressNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not a XENIX named type fileNot a data messageNot a directoryNot a name fileNot a stream deviceNot availableNot enough spaceNot foundNot found, no such nameNot master server for this domainNot ownerNot supportedNumber of Columns : %d +-Number of objects : %u +-Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKSNumerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation canceledOperation not applicableOperation not permittedOperation not supportedOperation not supported on transport endpointOperation now in progressOperation would blockOption not supported by protocolOut of stream resourcesOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial successPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badReserved for future useResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResult too largeResults sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLETABLE +-TABLE,yesTable Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo many attributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-Use separate cache for each userUser defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter '%s' in class `%s' must be in class `%s'character '%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter 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 valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror getting callers id: %serror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' undefinedfile `%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :`%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in `%s'.netname2user: principal name `%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127warning: while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: German +-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: »« muß größer als »« 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 ZeichenbereichDas Zeichen »« darf nicht in der Klasse »%s« enthalten seinDas Zeichen »« ist nicht in der Klasse »%s« enthalten?AbgebrochenZugriffsrechte: Zugriff auf eine fehlerhafte oder defekte Shared LibraryDie Adresse wird bereits verwendetDie Adreßfamilie für Hostnamen wird nicht unterstütztDie Adreßfamilie wird von der Protokollfamilie nicht unterstütztDie Adreßfamilie wird von der Protokollfamilie nicht unterstütztKonflikt mit BekanntmachungDer Wecker klingeltÜberlauf der »anode«-TabelleDie Argumentliste ist zu langDie Argumentliste ist zu langDas Argument ist außerhalb des DefinitionsbereichesVersuch, eine nicht-leere Tabelle zu löschenVersuche mehr Shared Libraries einzubinden als das Systemlimit zuläßtVersuch zu viele Shared Libraries einzubindenAuthentifizierung OKFehler bei der AuthentifizierungBOGUS OBJEKT +-Ungültige AdresseUngültiger Deskriptor zum DatenaustauschUngültiger DateideskriptorUngültiger DateideskriptorUngültiges Font-DateiformatUngültige NachrichtUngültiger Aufruf-CodeUngültiger Aufruf-DeskriptorUngültiger BetriebssystemaufrufUngültiger Wert für »ai_flags«Sei strikt POSIX-konformBinäre Daten +-Es ist ein Block-Device notwendigPoll-Problem beim BroadcastDatenübergabe unterbrochen (broken pipe)Bus-ZugriffsfehlerCDSRechenzeitbegrenzung überschrittenDer Cache ist verfallenAuf eine benötigte Shared Library kann nicht zugegriffen werdenEine Shared Library kann nicht direkt ausgeführt werdenKein Server für diese NIS-Domain gefundenKeine Kommunikation mit dem Portmapper möglichKeine Kommunikation mit »ypbind« möglichKeine Kommunikation mit »ypserv« möglichNicht genügend Hauptspeicher verfügbarDie angeforderte Adresse kann nicht zugewiesen werdenKann den Socket für den Broadcast-RPC nicht erstellenEine Shared Library kann nicht direkt ausgeführt werdenMehr als ein File-Generation-Flag angegeben, es ist nur eins erlaubt! +-Kann die Antwort auf den Broadcast nicht empfangenKann den Service nicht registrierenKein Senden nach dem Beenden des Sockets möglichEin Senden nach dem Beenden des Sockets ist nicht möglichKann das Broadcast-Paket nicht sendenKann die Option »SO_BROADCAST« nicht beim Socket setzenEs 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 BereichesTrennzeichen : %c +-Der Kind-Prozeß ist beendetDie Bestätigung des Clients ist zu unsicherSpalten : +-Kommunikationsfehler beim SendenUmwandeln der Lokale-SpezifikationDer Computer hat den Bauernhof erworbenBerechnung 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 abgelehntDie Verbindung wurde vom Kommunikationspartner zurückgesetztDie Wartezeit für die Verbindung ist abgelaufenFortgesetztKonvertiert die Kodierung von Dateien in eine andere Kodierung.Übersetze den Schlüssel in KleinbuchstabenCopyright © %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 erstellenErzeuge die C Headerdatei NAME mit den SymboldefinitionenDie Ausgabedatei wird erzeugt, obwohl Warnungen ausgegeben wurdenErstellt eine einfach DB Datenbank aus einer Text-Eingabe.Erstellungszeit: %sUngültiger Link über Gerätegrenzen hinwegDer DES-Eintrag für den netname »%s« ist nicht eindeutig +-VERZEICHNIS +-DNANSDNSDie Datenbank für die Tabelle existiert nichtDie Databank ist belegtVerklemmung erkannt/vermiedenStandard-Zugriffsrechte : +-Es ist eine Zieladresse notwendigDas Gerät oder die Ressource ist belegtDas Gerät ist kein StreamDas Gerät ist nicht konfiguriertDas Gerät oder die Ressource ist belegtDiffie-Hellmann (%d Bits) +-Verzeichnis : %s +-Das Verzeichnis ist nicht leerDer zugewiesene Plattenplatz (Quota) ist überschrittenDer zugewiesene Plattenplatz (Quota) ist überschrittenFühre kein »fork()« aus und zeige Nachrichten auf dem aktuellen tty anGebe keine Nachrichten aus, während die Datenbank aufgebaut wirdVerwende nicht den existierenden Katalog; erzwinge eine neue AusgabedateiDie Domain wurde nicht zugewiesenEMT-TrapENTRY +-Verschlüsselte Daten +-Die Typen des Eintrages/der Tabelle passen nicht zusammenFehler 0Fehler 100Fehler 101Fehler 102Fehler 103Fehler 104Fehler 105Fehler 106Fehler 107Fehler 108Fehler 109Fehler 110Fehler 111Fehler 112Fehler 113Fehler 114Fehler 115Fehler 116Fehler 117Fehler 118Fehler 119Fehler 136Fehler 142Fehler 58Fehler 59Fehler 72Fehler 73Fehler 75Fehler 76Fehler 91Fehler 92Fehler 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-ProzedurFehler: Die Datei ».netrc« ist für andere Benutzer lesbar.Vermittlung ist überfülltFehler im Format der ProgrammdateiFataler Fehler: Das System definiert das Symbol »_POSIX2_LOCALEDEF« nichtDateiFILE enthält Zuordnungen von symbolischen Namen zu UCS4-WertenFehlgeschlagen (Fehler nicht genau zu spezifizieren)Die Dateizugriffsnummer ist ein schlechter VerfassungDie Datei existiert bereitsVerklemmung beim Datei-LockingVerklemmung beim Datei-LockingDer Dateiname ist zu langDie maximale Dateigröße ist überschrittenÜberlauf der Datei-Deskriptoren-TabelleDie Datei ist zu großDie Verkettung mittels First/Next ist defektGleitkomma-AusnahmeVollständige Resynchronisation für das Verzeichnis ist erforderlichDie angeforderte Funktion ist nicht implementiertGROUP +-Unsinnige Daten in ARGP_HELP_FMT: %sGeneriere 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 SystemfehlerHole Lokale-spezifische Informationen.Gibt kurze Bedienungshinweise ausGibt diese Hilfe ausIrgendein FehlerGruppe : %s +-Gruppen Flags:Gruppen-Eintrag für die Gruppe »%s.%s«: +-Warte für SECS Sekunden (Standardwert ist 3600)AufgelegtHabe »%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 aktivFehler beim Auflösen des HostnamensEin-/AusgabefehlerEin-/Ausgabe ist möglichEingabedatei Ausgabedatei +--o Ausgabedatei Eingabedatei +--u EingabedateiEin-/Ausgabe-Trap (IOT)IVYBezeichner wurde entferntUngültige Byte-FolgeUngültiger MaschinenbefehlUngültiger Objekt-Typ für die angeforderte OperationNicht erlaubter SeekUnpassender Dateityp oder unpassendes DateiformatUnpassender IOCTL (I/O-Control) für das GerätUnpassende Operation für den HintergrundprozeßInformationsanfrageInformation:Eingabedateien:Beschreibung des Ein-/Ausgabe-Formates:Eingabe-/AusgabefehlerInterner NIS-FehlerInterner Fehler in »ypbind«UnterbrechungUnterbrechung während des BetriebssystemaufrufsDer unterbrochene Betriebssystemaufruf sollte neu gestartet werdenDas Argument ist ungültigUngültiger Verweis zurückUngültiger Name für eine ZeichenklasseDie Bestätigung des Clients ist ungültigUngültige Überprüfung des ClientsUngültiges SortierzeichenUngültiger Inhalt von »\{\}«Ungültiger Link über Gerätegrenzen hinwegUngültiger AustauschUngültiges Objekt für diese OperationUngültiges oder unvollständiges Multi-Byte oder Wide-ZeichenDer vorherige reguläre Ausdruck ist nicht korrekt.Das Ende des angegebenen Intervalls ist nicht gültigUngültiger regulärer AusdruckUngültiger Aufruf-CodeUngültiger Aufruf-DeskriptorUngültige Überprüfung des ServersUngültiger SlotDer angegebene Cache wird verworfenIst ein VerzeichnisIst eine »named file«Ist eine »named type file«Kerberos. +-GetötetLINK +-Der LOCAL Eintrag für die UID »%d« im Verzeichnis »%s« ist nicht eindeutig +-Level 2 angehaltenLevel 2 ist nicht synchronisiertLevel 3 angehaltenLevel 3 zurückgesetztDer Link wurde beschädigtDie Link-Nummer ist außerhalb des gültigen BereichesDer Link verweist auf einen ungültigen NamenVerbundener Objekt-Typ : Verbunden zu : %s +-Der lokale Domain-Name ist nicht eingetragenLokaler Fehler bei der RessourcenreservierungDie Maschine ist nicht an das Netzwerk angeschlossenUngültiger oder fehlerhafter NameObligatorische 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 HauptspeicherKein Hauptspeicher mehr verfügbarDie Nachrichtentabelle ist vollDie Nachricht ist zu langFehlendes oder fehlerhaftes AttributMod. Zeit : %sModifikation fehlgeschlagenDie Veränderung ist fehlgeschlagenModifiziere Ausgabe-Format:Ein »Multihop« wurde versuchtNAMEName +-[-a|-m]NISNIS Client/Server Versionen passen nicht zusammen - kein Service möglichDie Datenbank mit der NIS-Map ist ungültigNIS+ Operation fehlgeschlagenDie NIS+ Server sind nicht erreichbarDer NIS+ Dienst ist nicht verfügbar oder nicht installiertKEIN OBJEKT +-NUMMERName : »%s« +-Name Service Cache Daemon.Der Name wird nicht von diesem Server verwaltetDer Name ist im Netzwerk nicht eindeutigDer Name oder der Dienst ist nicht bekanntDer Name bzw. Eintrag ist nicht eindeutigDas benannte Objekt ist nicht durchsuchbarAuthentikator benötigtDas Netzwerk hat die Verbindung nach einem Reset beendetDas Netzwerk hat die Verbindung nach einem Reset verlorenDas Netzwerk ist nicht aktivDas Netzwerk ist nicht erreichbarKeine »CSI«-Struktur verfügbarKeine XENIX-Semaphoren verfügbarZu diesem Hostnamen gehört keine AdresseZu diesem Namen gehört keine AdresseKeine AnodeKein Hauptspeicher für den Puffer verfügbarKeine Kind-ProzesseKeine Daten verfügbarAuf dem Server ist kein Speicherplatz mehr verfügbarKeine Sperren verfügbarKeine Übereinstimmung gefundenKein Medium gefundenKeine Nachricht des gewünschten TypsKeine weiteren Sätze in der Map-DatenbankEs wurde bisher noch kein regulärer Ausdruck definiertKeine Datensatz-Sperren verfügbarEs sind keine entfernten Programme registriert. +-Keine Route zum ZielrechnerAuf dem Gerät ist kein Speicherplatz mehr verfügbarKein passendes Gerät gefundenKein passendes Gerät bzw. keine passende Adresse gefundenDatei oder Verzeichnis nicht gefundenKein passender Schlüssel in der MapKeine passende Map in der Domain des ServersKein passender Prozeß gefundenKein NIS+ Namespace gefundenNicht-behebbarer Fehler in der NamensauflösungKeine. +-Keine XENIX »named type« DateiDas ist keine »data message«Ist kein VerzeichnisKeine »named file«Ist kein Stream-GerätNicht verfügbarNicht genugend (Speicher-) PlatzNicht gefundenNicht gefunden, kein solcher NameKein Master-Server für diese DomainBin nicht der EigentümerNicht unterstütztAnzahl der Spalten : %d +-Anzahl der Objekte: %u +-Die Anzahl der symbolischen Link, die beim Durchgehen des Pfades gefunden wurden, überschreitet den Wert MAXSYMLINKSDas numerische Argument ist außerhalb des DefinitionsbereichesDas numerische Ergebnis ist außerhalb des gültigen BereichesObjekt #%d: +-Objekt-Name : %s +-Objekt-Typ : Das Objekt ist remoteEin Objekt mit demselben Namen existiert bereitsUngerade Anzahl von AnführungszeichenNur der Systemverwalter »root« darf diese Option benutzen!Die Operation wird bereits ausgeführtDie Operation wird abgebrochenDie Operation ist nicht anwendbarDie Operation ist nicht erlaubtDie Operation wird nicht unterstütztDie Operation wird am Transporkt-Endpunkt nicht unterstütztDie Operation ist jetzt in BearbeitungDie Operation würde blockierenDie Option wird vom Protokoll nicht unterstütztKeine Stream-Ressourcen mehr verfügbarKeine Stream-Ressourcen mehr verfügbarAusgabesteuerung:Ausgabeselektion:Eigentümer : %s +-PRIVAT +-Das Zusatzpacket ist nicht installiertSyntax-Fehler: %sTeilweise erfolgreichDas übergebene Objekt ist nicht dasselbe Objekt auf dem ServerKeine BerechtigungFehler in der StromversorgungUnerwartetes Ende des regulären AusdruckesDrucke den Inhalt der Datenbank-Datei, je Eintrag eine ZeileDrucke die aktuelle KonfigurationsstatistikGibt mehr Nachrichten ausGib die Programmversion ausMöglicherweise erfolgreichMöglicherweise nicht gefundenZeitnehmer zur Laufzeitbestimmung ist abgelaufenDas Protokoll ist nicht verfügbarProtokollfehlerDie Protokollfamilie wird nicht unterstütztDas Protokoll ist nicht verfügbarDas Protokoll wird nicht unterstütztDas Protokoll paßt nicht zu dem SocketDie Abfrage ist für die angegebene Tabelle nicht erlaubtVerlassenRFS-spezifischer FehlerRPC: ungültige Prozedur für das ProgrammRPC: Fehler bei einer NIS-OperationRPC: Programm nicht verfügbarRPC: Die Programmversion ist falschRPC: Die Struktur ist ungültigRPC: falsche VersionRPC: (Unbekannter Fehlercode)RPC: Fehler bei der AuthentifizierungRPC: Kann das Ergebnis nicht dekodierenRPC: Kann die Argumente nicht kodierenRPC: Fehlgeschlagen (Fehler nicht zu spezifizieren)RPC: Die RPC-Versionen sind nicht kompatibelRPC: Fehler des PortmappersRPC: Prozedur nicht verfügbarRPC: Programm nicht registriertRPC: Programm nicht verfügbarRPC: Programm/Version nicht passendRPC: Fehler des entfernten SystemsRPC: Server kann die Argumente nicht dekodierenRPC: ErfolgreichRPC: Wartezeit abgelaufenRPC: Kann nicht empfangenRPC: Kann nicht sendenRPC: Unbekannter RechnerRPC: Unbekanntes ProtokollRSA (%d Bits) +-»RTLD_NEXT« wird in Code verwendet, der nicht dynamisch geladen istLese und gib die Profiling-Informationen von Shared Objects aus.Lese die Konfiguration aus NAMEDas Dateisystem ist nur lesbarReal-Time Signal %dDer reguläre Ausdruck ist zu großEin-/Ausgabefehler des entfernten SystemsDie entfernte Adresse hat sich geändertDas Paßwort löschen oder die Datei für andere nicht lesbar anlegen.Erneutes Öffnen des Shared Objects »%s« ist mißlungenReplik : +-Fehlermeldungen bitte an »%s« senden. +-Fehler bitte mit dem »glibcbug«-Skript an melden. +-Die Request-Argumente sind ungültigReserviert für eine zukünftige VerwendungFehler 0 des Resolvers (Kein Fehler)Interner Fehler des ResolversVerklemmung beim Zugriff auf eine Ressource vermiedenDie Ressource ist verlorengegangenDie Ressource ist zur Zeit nicht verfügbarDas Ergebnis ist zu großErgebnisse an die Callback-Prozedur gesendetSHOBJ [PROFDATA]SUNYPSuchpfad : %s +-SpeicherzugriffsfehlerDer Server ist zur Zeit beschäftigt, bitte nochmal versuchenDer Hauptspeicher des Servers ist erschöpftDer Server hat die Bestätigung zurückgewiesenDer Server hat die Überprüfung zurückgewiesen»Servname« wird für »ai_soctype« nicht unterstütztSetzt den Programm-NamenStoppt den ServerSignal 0Socket-Operation an einem nicht-SocketSocket-Typ wird nicht unterstütztDas Programm verursachte den Abbruch der VerbindungSorry, diese Funktion kann nur vom Systemverwalter durchgeführt werden. +-Die Quell-Definitionen stehen in der Datei FILE»Srmount«-FehlerStackfehlerVeraltete NFS-DateizugriffsnummerStarte die Anzahl NUMBER ThreadsStatus : %s +-AngehaltenAngehalten (Signal)Angehalten (tty-Eingabe)Angehalten (tty-Ausgabe)Fehler in Stream-PipeDie Struktur muß bereinigt werdenErfolgUnterdrücke Warnungen und informative NachrichtenSymbolische Namen für Zeichen sind in der Datei FILE definiertSystemfehlerSystem-Information:Fehler bei der Beschaffung einer SystemressourceSystem-Verzeichnis für character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABELLETABELLE +-TABELLE,jaTabellentyp : %s +-Temporärer Fehler bei der NamensauflösungBeendetDas 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 abgelaufenZu viele AttributeZu viele Ebenen aus symbolischen LinksZu viele LinksZu viele offene DateienZu viele offene Dateien im SystemZu viele ProzesseZu viele Referenzen: can't spliceZu viele BenutzerTrace/Breakpoint ausgelöstAngehängter Backslash (»\«)Der Übersetzer ist gestorbenDer Socket ist bereits verbundenDer Socket ist nicht verbunden»%s --help« oder »%s --usage« gibt weitere Informationen. +-Versuche »%s«... +-Typ : %s +-UNBEKANNTDie Echtheit des NIS+-Clients kann nicht geprüft werdenDie Echtheit des NIS+-Servers kann nicht geprüft werdenDie Callback-Prozedur kann nicht erstellt werdenEs kann kein Prozeß auf dem Server gestartet werdenUnbekannt (Typ = %d, Bits = %d) +-Unbekanntes Schlüsselwort »%s« in der Datei ».netrc«Unbekannter NIS-FehlercodeUnbekannte Datenbank: %s +-Unbekannter FehlerUnbekannter Fehler Unbekannter RechnerUnbekanntes ObjektUnbekannte Option: %s %s %sUnbekannter Fehler des »Resolvers«Unbekannter Fehler des ServersUnbekanntes Signal %dUnbekannter SystemfehlerUnbekannter Fehler im »ypbind«»(« oder »\(« ohne schließende Klammer»)« oder »\)« ohne öffnende Klammer»[« oder »[^« ohne schließende Klammer»\{« ohne schließende KlammerUnbekannte Variable »%s«Dringende Ein-/AusgabebedingungSyntax:Syntax: %s Variablenname [Pfadname] +-Syntax: rpcinfo [ -n Portnummer ] -u Rechner Programmnummer [ Versionsnummer ] +-Verwende für jeden Benutzer einen eigenen CacheBenutzerdefiniertes Signal 1Benutzerdefiniertes Signal 2Der Wert ist zu groß für den definierten DatentypDer virtuelle Zeitnehmer ist abgelaufenWildes Ergebnis aus der KommandoausführungDie Fenstergröße wurde verändertGibt die Namen der verfügbaren »charmaps« ausGibt die Namen der verfügbaren Lokalen ausGibt die Namen von ausgewählten Kategorien ausGibt die Namen von ausgewählten Schlüsselwörtern ausSchreibe die Ausgabe in die Datei NAMEImplementiert von %s. +-Falscher Medien-TypX500XCHSYPBINDPROC_DOMAIN: %s +-Ja, 42 ist die Antwort auf die Frage nach dem Leben, dem Sein und allem sonstDiesmal hast Du es wirklich kaputtgemachtDie 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ütztist bereits gestartetDas Argument für »<%s>« muß ein einzelnes Zeichen seinDas Argument zu »%s« muß ein einzelnes Zeichen seinauth_none.c - Fatales »marshalling«-Problemauthunix_create: Hauptspeicher erschöpft +-Das Argument ist ungültigUngültiger EigentümerLeeres FROM-Feld in der Link-ZeileLeeres TO-Feld in der Link-ZeileSpeicherblock 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überlaufcache_set: Kann keinen neuen RPC-Puffer »rcp_buffer« anlegencache_set: Das Opfer wurde nicht alloziertcache_set: Das Opfer wurde nicht gefundenKann die Abkürzung der Zeitzone zur Verwendung direkt nach der Ende-Zeit nicht bestimmenKann die Prozedurnummer %d nicht erneut zuweisen +-Kann den Status der Lokale-Datei »%s« nicht bestimmenNicht genügend Hauptspeicher für Symboldaten verfügbarKann keinen internen Deskriptor erzeugenKann keine internen Deskriptoren erzeugenDer Socken kann nicht zum Annehmen von Verbindungen aktiviert werden: %sKann den C Präprozessor nicht finden: %s +-Kann keinen C Präprozessor finden (cpp) +-Kann die alte Version %d nicht verarbeiten; aktuelle Version ist %dKann das Sortierelement »%.*s« nicht einfügenKann nicht in die Ergebnistabelle einfügenKann die neue Sortiersymboldefinition nicht einfügen: %sKann die Profiling-Daten nicht ladenÖffnen fehlgeschlagenÖffnen von »%s« fehlgeschlagenKann die Ausgabedatei »%s« nicht öffnen: %sKann die Eingabedatei »%s« nicht öffnenKann die Lokale-Definitionsdatei »%s« nicht öffnenKann die Ausgabedatei nicht öffnenKann die Ausgabedatei »%s« nicht öffnenKann die Ausgabedatei »%s« für die Kategorie »%s« nicht öffnenKann den Socket nicht öffnen: %sKann die Spezifikation der Sortierreihenfolge nicht verarbeitenDas Verzeichnis »%s« der Zeichensatz-Definitionen kann nicht gelesen werdenKann die Konfigurationsdatei nicht lesen; das ist fatalKann nicht vom Client lesenKann den Header von »%s« nicht lesenKann das Lokale-Verzeichnis »%s« nicht lesenKann die Lokale-Datei »%s« nicht lesenKann die »repertoire«-Map »%s« nicht lesenKann keine Statistikdaten lesenKann den Status (stat()) der Datei »%s« nicht lesen: %sKann die Ausgabedatei »%s« nicht schreibenKann das Ergebnis nicht schreiben: %sKann die Statistik nicht schreiben: %sKann nicht zum Client schreibenDie Daten einer Kategorie sind mehrfach angefordert worden, das sollte nicht passierenDas Zeichen »%s«, das in der Zeichenklasse »%s« enthalten ist, muß auch in der Zeichenklasse »%s« enthalten seinDas Zeichen »%s« in der Zeichenklasse »%s« darf nicht in der Zeichenklasse »%s« enthalten seinDas Zeichen »« ist in der Zeichen-Definition nicht enthaltenDas Zeichen L»%s« (Index %Zd), das in der Zeichenklasse »%s« enthalten ist, muß auch in der Zeichenklasse »%s« enthalten seinDas Zeichen L»%s« (Index %Zd) in der Zeichenklasse »%s« darf nicht in der Zeichenklasse »%s« enthalten seinDas Zeichen »%s« ist nicht definiert, wird aber als Vorgabewert benötigtDie Zeichenklasse »%s« ist bereits definiertDie Zeichensatzbeschreibung »%s« ist bereits definiertDie Zeichensatzbeschreibungsdatei »%s« wurde nicht gefundenclnt_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 ignoriertDas Sortierungssymbol »%.*s« ist mehr als einmal angegeben; die Zeile wird ignoriertNach »%s« wird ein Sortierungssymbol erwartetVerbindungsaufbau zur Adresse %s: Konstante oder Bezeichner erwartetKonvertierung von »%s« nach »%s« wird nicht unterstütztDie Konvertierung wurde wegen Problemen bei der Ausgabe beendetKann keinen RPC-Server erzeugen +-Kann das Programm »%d« Version »%d« nicht registrieren +-Datenbank [Schlüssel ...]Die Default-Zeichensatzbeschreibung in der Datei »%s« wurde nicht gefundenDer 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 ZeichenDer Name des Zeichens »%s« ist mehrfach angegebenMehrfache Definition des SortierungselementesMehrfache Definition des Eintrages »%.*s«Doppelter SchlüsselDoppelte »set«-DefinitionDoppelter Zonenname »%s« (Datei »%s«, Zeile %d)Der Nachrichtenbezeichner ist mehrfach vorhandenDie Nachrichtennummer ist mehrfach vorhandenLeere ZeichenketteLeerer Name des Sortiergewichtes: Die Zeile wird ignoriertenablecache: Cache ist bereits aktivenablecache: Kann keinen Cache anlegenenablecache: Kann die Cache-Daten nicht anlegenenablecache: Kann keinen FIFO-Cache anlegenKodierung für die AusgabeKodierung für den ursprünglichen TextDas Ende eines Auslassungsintervalls ist größer als der StartFehler beim Feststellen der Identität des Aufrufers: %sFehler beim Schließen der Eingabedatei »%s«Fehler beim Schließen der Ausgabedatei Fehler beim Schließen der Datei mit den Profiling-DatenFehler beim Einfügen des Sortierelementes in die Hash-TabelleFehler beim Einfügen in die Hash-TabelleFehler beim Lesen der EingabeFür »copy« wird ein String-Argument erwartetDie erwartete Fortsetzungszeile ist nicht vorhandenFehler beim Laden des Shared Objects »%s«Fehler beim Laden der SymboldatenFehler beim »mmap« der Datei mit den Profiling-DatenFehler beim Start der KonvertierungFehler beim Schreiben der Daten für die Kategorie »%s«fcntl: F_SETFDDer Eintrag »%s« in der Kategorie »%s« ist nicht definiertDie Datei »%s« existiert bereits und würde überschrieben +-Der »From«-Wert eines Sortierelementes muß ein String seinFehler beim Holen des Datei-Status mit »fstat«Murks am Ende einer ZeichensatzspezifikationAm Ende der Zahl sind unsinnige EinträgeUnsinnige 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-GraphenErzeuge ein 'flaches' Profile mit Aufrufzahlen und -zeitenget_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 verwendetIst irgendwo ein Hard-Linkungültiges »CORRECTION«-Feld in der »Leap«-Zeileungültiges »Rolling/Stationary«-Feld in der »Leap«-ZeileUngültige Zeichenkonstante in der ZeichenketteUngültiges Zeichen in der Datei: Ungültiges SortierelementUngültige DefinitionUngültige Kodierung angegebenungültige Escape-Sequenz am Ende der Zeichenketteungültige Eingabe-Sequenz an der Stelle %ldungültige Namen für den Zeichenbereichungültiger nettype : »%s« +-ungültige Nummer für den Offset in der Zeichenkette %d im »era«-Feld in der Kategorie »%s«ungültige »set«-Nummerungü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 erlaubtLimit der Implementation: Es sind nicht mehr als %d Zeichen-Maps erlaubtunvollständige Zeichen- oder Shift-Folge am Ende des Puffersungültig formatierte DateiDie Eingabezeile ist von einem unbekannten Typinterner Fehler (ungültiger Descriptor)Interner Fehler - »addtype« wurde mit einer ungültigen »isdst« aufgerufenInterner Fehler - »addtype« wurde mit einem ungültigen »ttisgmt« aufgerufenInterner Fehler - »addtype« wurde mit einem ungültigen »ttisstd« aufgerufenInterner Fehler in der Datei »%s«, Zeile %uungültiger UTC-Offsetungültiges AbkürzungsformatUngültiger Tag des MonatsUngültiges Ende-JahrUngültiges SchaltjahrUngültiger Mode für dlopen()ungültiger MonatsnameUngültige gespeicherte ZeitUngültiges AnfangsjahrUngültige Tageszeitungültiger Name für einen WochentagDie Schlüssellänge in der Anforderung ist zu lang: %ZdDie Zeile nach einem Auslassungintervall muß eine Zeichen-Definition enthaltenDie Zeile vor einem Auslassungsintervall muß eine Zeichen-Konstante enthaltenDie Zeile ist zu langGib alle bekannten Zeichensatz-Kodierungen ausDie Lokale-Datei »%s«, die im »copy«-Befehl verwendet wird, ist nicht vorhandenFehler beim Holen des Link-Status mit »lstat«ungültige Eingabezeile ignoriertDas Mappen der Section-Header String-Tabelle ist fehlgeschlagenDas Mapping der Section-Headers ist fehlgeschlagenDer Speicher vor dem allozierten Block wurde überschrieben +-Der Speicher nach dem Ende des allozierten Blockes wurde überschrieben +-Kein Hauptspeicher mehr verfügbarDie 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 NameWeder die ursprüngliche noch die Ziel-Kodierung angegebennetname2user: (NIS+ Lookup): %s +-netname2user: DES Eintrag für »%s« im Verzeichnis »%s« ist nicht eindeutignetname2user: LOCAL Eintrag für »%s« im Verzeichnis »%s« ist nicht eindeutignetname2user: fehlende Group-ID Liste in »%s«.netname2user: der Principal-Name »%s« ist zu langnetname2user: Sollte nicht die Benutzernummer 0 habenDas Programm %d wurde nie registriert +-Kein oder Wert angegebenKein gültiger regulärer Ausdruck für den Eintrag »%s« in der Kategorie »%s«: %sKein Tag des Monats paßt zur angegebenen RegelKeine 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 wirdEs wurde keine Ausgabedatei erzeugt, weil Warnungen ausgegeben wurdenkeine »repertoire«-Map angegeben: Verarbeitung abgebrochenKein symbolischer Name angegebenKein symbolischer Name für das Ende des Intervalles angegebenKein Sortiergewicht (»Weight«) für das Symbol »%s« definiertKeine reguläre Dateinscd Konfiguration: +- +-%15d Server Debug Level +-nscd läuft nicht! +-Nur »WIDTH«-Definitionen dürfen nach einer »CHARMAP«-Definition folgenDie ursprüngliche Kodierung nicht mit »-f« angegebenAusgabedateipmap_getmaps RPC Problempoll: Protokollfehler im Verbindungsaufbau +-Fehler beim Aufruf des PräprozessorsGib eine Liste der gezählten Pfade und der Anzahl der Benutzung ausGebe Informationen über den Bearbeitungsstand ausProbleme 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«-SekundeDie »repertoire« Map-Datei »%s« wurde nicht gefundenrpcgen: 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 erreichenDieselbe Regel ist in mehreren Dateien enthaltenKurzer Read beim Lesen des Anforderungsschlüssels: %sKurzer Read beim Lesezugriff: %sKurzer Write in »%s«: %ssocket: Protokollfehler im Verbindungsaufbau +-Die Anweisungen »forward« und »backward« schließen sich ausDie Angabe eines Sortiergewichtes für ein Sortiersymbol ist nicht sinnvollStandardeingabeStandardausgabeDas Start-Datum in der Zeichenkette %d im »era«-Feld der Kategorie »%s« ist ungültigDas Start-Jahr ist größer als das Ende-JahrDas Startjahr ist zu groß für die DarstellungDas Startjahr ist zu klein für die DarstellungDas Ende-Datum in der Zeichenkette %d im »era«-Feld in der Kategorie »%s« ist ungültigsvc_run - »select« ist fehlgeschlagensvc_tcp.c - »getsockname« oder »listen« nicht möglichsvc_tcp.c - Problem bei der Erstellung des TCP-Socketssvc_tcp: makefd_xprt: Hauptspeicher erschöpft +-svc_unix.c - Problem bei der Erstellung des AF_UNIX-Socketssvc_unix.c - »getsockname« oder »listen« nicht möglichsvc_unix: makefd_xprt: Hauptspeicher erschöpft +-svctcp_create: Hauptspeicher erschöpft +-svcudp_create - »getsockname« fehlgeschlagensvcudp_create: Hauptspeicher erschöpft +-svcudp_create: Problem bei der Erstellung des Socketssvcunix_create: Hauptspeicher erschöpft +-Das Symbol für das Mehr-Zeichen Sortierelement »%.*s« wiederholt die ElementdefinitionDas Symbol für das 'multicharacter' Sortierelement »%.*s« wiederholt eine andere SymboldefinitionDas Symbol für das 'multicharacter' Sortierelement »%.*s« wiederholt eine SymboldefinitionDas Symbol für das 'multicharacter' Sortierelement »%.*s« kollidiert mit einem symbolischen Namen in der ZeichensatzbeschreibungSyntaxfehler in der »%s«-Definition: %sSyntaxfehler in der »order_start«-AnweisungSyntaxfehler in der ZeichenklassendefinitionSyntaxfehler in der ZeichensatzumwandlungsdefinitionSyntaxfehler in der Definition der SortierreihenfolgeSyntaxfehler in der Definition der SortierungSyntaxfehler in der Definition der »LC_CTYPE«-KategorieSyntaxfehler in der Definition einer neuen ZeichenklasseSyntaxfehler in der Definition eines neuen ZeichensatzesSyntaxfehler 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: %sSyntaxfehler in der »epertoire« Map-Definition: %sSyntaxfehler in der Lokale-Definition zur Zeit (Abschnitt »time«)Syntaxfehler: nicht in einem Abschnitt der Lokale-DefinitionDie Zielkodierung ist nicht mittels »-t« angegebenDies ist die erste DefinitionZeit vor NullÜberlauf der ZeitZu wenige Bytes in der ZeichenkodierungZu viele Bytes in der ZeichenkodierungZu viele Zeichenklassen definiertZu viele SchaltsekundenZu viele OrtszeittypenZu viele Übergänge?!Zu viele SortiergewichteZu viele oder zu lange Abkürzungen für ZeitzonenAm Zeilenende sind unsinnige EinträgeSchwierigkeiten bei der Antwort an das Programm %d +-Zwei aufeinanderfolgende Zeilen mit »...« sind nicht erlaubtEin einzelnes Jahr angegebenFehler beim Allozieren des Puffers für die EingabeFehler beim Freigeben des Speichers für die Argumentenicht definiertunbekanntes Zeichen »%s«Ungültiges Zeichen im Feld »%s« in der Kategorie »%s«unbekannte »collation«-Anweisungunbekannte Anweisung »%s«: Die Zeile wurde ignoriertunbekannter iconv()-Fehler %dUnbekanntes Set »%s«Unbekanntes Symbol »%.*s«: Die Zeile wurde ignoriertZeitzone ohne RegelnDie Nachricht ist nicht abgeschlossenZeichenkette wird nicht beendetZeichenkette wird nicht beendetDer symbolische Name wird nicht beendetDer Name des Sortiergewichtes wird nicht beendetDas obere Ende des Intervalls ist nicht kleiner als das untere EndeSyntax: %s Eingabedatei +-Der 29. Februar wurde in einem nicht-Schaltjahr verwendetDer Wert für »%s« muß eine Ganzzahl seinDer Wert für »<%s>« muß zwischen eins und vier liegenDer Eintrag für das Feld »%s« in der Kategorie »%s« darf nicht leer seinDer Wert von »« muß größer als der Wert von »« seinDer Wert im Feld »int_curr_symbol« in der Kategorie »LC_MONETARY« gehört nicht zu einem gültigen Namen in ISO-4217Der Wert im Feld »int_curr_symbol« in der Kategorie »LC_MONETARY« hat die falsche LängeDer Wert für den Eintrag »%s« in der Kategorie »%s« muß kleiner als 127 sein.Warnung: Beim Annehmen der Verbindung: %sBeim Anfordern eines Cache-EintragesFehler beim Allozieren des Eintrages in die Hash-TabelleBeim Anfordern einer Schlüssel-Kopiebeim Öffnen der alten Katalogdateibeim Aufbereiten der Ausgabebeim Lesen der Datenbankbeim Holen des Dateistatus der Datei mit den Profiling-Datenbeim Schreiben der DatenbankdateiDer 'Write' wurde nur unvollständig ausgeführtist auch für andere Benutzer als den Dateieigentümer beschreibbarFalsche Anzahl an ArgumentenFalsche Anzahl an Feldern in der Leap-ZeileFalsche Anzahl der Felder in der Link-ZeileFalsche Anzahl der Felder in der Rule-ZeileFalsche Anzahl der Felder in der Zeitzonen-FortsetzungszeileFalsche Anzahl an Feldern in der Zone-Zeilexdr_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 @@ +-Þ•Jl¼$1" 1",1O1:k1¦1Ä1ß1æ13ø13,2`2&t2%›2Á2%Ø23þ223"K3!n33§3À3Ú3ð3"4*)4T4&n4&•4&¼4&ã4& +-5$15V5q5‹5,¥5Ò5%ð5,6-C6 q6&’6¹6Ø6ò67‰272¼7#ï7 88.8'N8v8(8 ¨8É8Ë8$Ó8ø8(989 H9T9/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 AA2A FA!SAuA.”AÃA×AêAýA BB+5BaBrB‰B¦BÀBØBôB C&C17C$iCŽC C»CÐCëC DDD4D;DJDcD rD€D–D¯D!ÉDëD EE+E9>ExE‘E¬E#¿EãEóE +-F%FCFcFlF†F™F«F¾FÇF×FòFG1GQGbGzG”G§GÆGÖGòG H#HAHRHpHŽH¦H!¾HàHúHI)I?I QI#_IƒI›I¸IÇIåIüIJ2J7JJJhJ…JŸJ¹JËJÝJ÷JK*KFK!fKˆK¡K¼KØKñKL"(L KLXLgL~L’L¤L-ºLèLþLM*M2AM;tM°MÆMâMúM N "NCNVNqNŠN“N²N ÌN íN ûNOO%O6OJO_OrO‹O"“O +-¶OÁO ÐO!ÞOPP#PAP"TPwP†P•P«P¾P'ÎP#öP&Q AQOQiQ€Q QœQ³QÈQÚQïQRR(R :RGRbRWwRVÏT·&W¼ÞY#›[:¿[ú[\%&\L\"b\…\”\¤\¶\Í\Fê\.1]6`]8—];Ð]I ^+V^+‚^'®^ Ö^ ã^í^ _'_%9_.__&Ž_µ_CÑ_#`9`&X``1Ÿ` Ñ`"Ý`a'aDa.aa"a(³a!Üaþa!b9=b4wb8¬b+åb8c$Jc"oc!’c.´c<ãc; d$\dd™d"¸d)ÛdNeUTeªe&Èe)ïe f'f+@flfŠf¤f"Äf%çf* g*8g0cg7”g#Ìg!ðg$h,7hdh'sh%›h2Áh ôh.i0iKIiL•iLâi2/jbj%xj-žj$Ìjñj kk(5k!^kF€kÇkBÚkBl?`l< lÝløl.m0Bm0sm¤mÂmÕmñmnn/nBnUnknn5”nGÊn o5 o Voco'zo,¢oÏoào&òo?p=Yp —p¥pA¿pqq7;q3sq§q'¾q!æqrCr]ryr)—r*Ár%ìrs$2sWssss¬s>Ìs t!*t#Lt pt*‘t*¼t=çtH%unu}uEu&Óu(úu'#vEKv‘v$ªv(Ïv'øv w">w&awPˆwVÙwU0xO†xVÖx!-y'Oy*wy/¢y*Òy$ýy/"z1Rz/„z)´z*Þz) {#3{W{&r{4™{Î{ë{ ü{# +-|$.|"S|v|Œ|¦|½|.Î|ý|}3:}n} €}Š}0¡}Ò}$î}~#$~ H~T~i~}~˜~4±~æ~'#BKDŽjÓK>€?Š€7Ê€9Pgƒ¡#»#ß#‚0'‚#X‚*|‚%§‚=Í‚9 „9E„„Nž„$í„…1…9…<M…<Š…Ç…)Ý…*†2†&G†=n†-¬†9Ú†5‡,J‡-w‡'¥‡$͇#ò‡0ˆFGˆŽˆ2«ˆ2Þˆ2‰2D‰2w‰.ª‰#Ù‰ý‰Š-9Š%gŠ)Š-·Š.åŠ(‹*=‹"h‹‹‹#¤‹#È‹ì‹>ŠŒ"ÉŒ ìŒöŒ+ )5 +-_5j+ Ì Î:Ø'Ž<;ŽxŽ ŠŽ,”Ž>ÁŽ(<+[‡˜³Ìéý"H8L/Î+þ+*‘#V‘4z‘6¯‘=æ‘/$’+T’H€’,É’<ö’,3“"`“8ƒ“%¼“â“R”YT”®”À” ß” í”áù”+Û•#–+–K–d–#ƒ–§–$Öè– +-ý–—%—57—m—%~—5¤— Ú—'û—#˜05˜f˜$€˜¥˜$¸˜ݘ û˜™0™9™'R™z™ +-’™™¶™Æ™Ö™&陚/-š]špš†š›š³š»š7ך›$›%=›(c›0Œ›½›Ý›$ü›!œ55œ(kœ”œ«œÆœáœ+ ,:J jtˆ¤¸Ï)â' ž 4ž UžvžŠž£žN·ž)Ÿ&0ŸWŸ.oŸžŸ ¶Ÿ)ן' ))  S (` ‰ £ !àå ö ¡=&¡(d¡-¡ »¡$Ü¡%¢#'¢4K¢€¢&¢Ä¢'Ø¢/£"0£S£p£Œ£©£-È£'ö£'¤!F¤h¤„¤•¤#ª¤%Τ*ô¤¥*2¥!]¥¥.Ÿ¥Î¥Õ¥!ð¥"¦$5¦-Z¦ˆ¦ £¦!Ħæ¦8ÿ¦68§%o§!•§·§ק&ô§¨(7¨&`¨A‡¨ ɨרè¨ü¨©2©CI©©­©#Ê© î©LªO\ª¬ª,ê(ðª!«;«%J«&p«%—«!½«ß«!æ«&¬'/¬W¬f¬$u¬ š¬¤¬µ¬ͬä¬ú¬­#­ C­P­i­-­­­É­+é­®22®e®®®¨®Ä®&Ù®&¯4'¯\¯o¯‰¯¨¯¸¯"ѯô¯°°8°N°`°r° „°’°"±°Ô°+ã³j·0zº-«¼RÙ¼",½"O½7r½ª½-ʽø½ ¾¾4¾"K¾kn¾,Ú¾M¿MU¿B£¿Yæ¿;@À;|À%¸À ÞÀêÀûÀÁ9Á6YÁ-Á*¾ÁéÁmÂ8vÂ7¯Â,çÂ,Ã6AÃxÃ5ŒÃ(ÂÃ/ëÃ'Ä=CÄ-Ä6¯Ä(æÄ&Å)6ÅK`ÅC¬ÅGðÅ48ÆEmÆ$³Æ%ØÆ+þÆ8*ÇWcÇV»Ç)È<È$WÈ'|È:¤ÈfßÈiFÉ°É"ËÉ'îÉ Ê#Ê-:ÊhʇÊ) Ê8ÊÊ2Ë<6Ë7sËG«Ë=óË)1Ì([Ì+„Ì:°ÌëÌ.úÌ.)ÍCXÍœÍ=­ÍëÍk ÎdwÎhÜÎ0EÏvÏ7Ï?ÈÏ0Ð9ÐVÐiÐ:‡Ð)ÂÐ\ìÐIÑT`ÑXµÑ@Ò?OÒÒ©Ò2ÉÒ4üÒ41Ó"fÓ‰Ó §ÓÈÓàÓøÓÔ(Ô>ÔXÔpÔ=ŠÔCÈÔ ÕIÕiÕ!zÕ/œÕ6ÌÕÖÖ1,ÖR^ÖR±Ö×"×C;×.×®×RÎ×<!Ø^Ø.yØ)¨ØÒØ@ìØ%-Ù%SÙ1yÙ1«Ù&ÝÙ%Ú%*ÚPÚpÚ"ŒÚ#¯ÚCÓÚÛ35Û5iÛ"ŸÛ3ÂÛ3öÛQ*ÜR|ÜÏÜàÜ^ðÜ5OÝ8…Ý7¾Ý]öÝTÞ(sÞ)œÞ-ÆÞ!ôÞ%ß-<ßXjßUÃßTàWnà^Æà'%á9Má/‡á3·á-ëá'â4Aâ8vâ6¯â/æâ1ã0Hã'yã"¡ã)Äã9îã(äEäWä+hä2”ä#Çä(ëä$å9åXå9nå*¨å,Óå:æ;æQæYæ6ræ©æ&Ãæêæ(ûæ $ç0çHç gçˆç:¦ç"áç)è2.èSaèMµèséQwéQÉéHê dê(…ê®ê"Ëê)îê<ëUë$në$“ë$¸ë.Ýë$ ìD1ì0vìnç9S1“È)´qp1Í/c­"Ldf0¡‡¸ +-‹ˆ‘—̓ Ä<ÿ¨ÛI;õ(YUÇ@£ý'Æ- HFzóoÇ'ÌanHîCFϺmj_>Ûà,gÊ·.çéòBÝ60i?ñM43´s¹ ÐåÕÉP®Eï`üÜëGI-lì½:ÑA=#[±äû+ ×öߣ¥×þ*ä ;kuoF>ñ pè…‡¿@"Qª7t ¡?œ=*¬VBÿvfúôËEH7‚-ð7‚Þ23íº·9W3?°âî.rd÷¯$ùm%ÕuK³%¤\DtO÷GߊXJZ꾩 8®”§5.rŒqü=2­y§:Ü[ì4’/Àþ…œ{cQ`z+hɦ¼^ûà“ÁÚs¶h¤RJÓÒS&Cø‰U:>€"€Ò²(|Kž ÁæÖÈiËÞx~ãJ –!,ÔT¦˜Š5¯e Êaôb‹Ã ,„³j‘¢YPL• ÂÌŸõò—š–©DNãCØ&<l}ĹIê/»ÔÖ6_°1á2*D6 XµæÎ+™•]»8~TÅ(Gw„Ú]WVÓáA”OðÝøéè!ª²¼å’ˆ†â)R4Ù¬gkŒ¢'Øv™Z¾ŽÀÅš«y †\#ž@Ÿ8#N^Ï;¥¸ ëóЫxM{±ÉÙÎ0<A}$í¨E9ù|µÆ›5w$ !Ž +-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: must be greater than +-%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 = character must not be in class `%s' character not in class `%s'?AbortedAccessing a corrupted shared libraryAddress already in useAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempting to link in too many shared librariesAuthentication OKAuthentication errorBad addressBad file descriptorBad font file formatBad messageBad system callBlock device requiredBroadcast select problemBroken pipeBus errorCPU time limit exceededCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTChannel number out of rangeChild exitedClient credential too weakCommunication error on sendComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedCopyright (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 exceededDatabase is busyDestination address requiredDevice not a streamDevice not configuredDevice or resource busyDirectory not emptyDisc quota exceededDomain not boundEMT trapError %dError in unknown error system: Error: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'Failed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFilesize limit exceededFloating point exceptionFunction not implementedGratuitous errorHangupHost is downHost name lookup failureI/O possibleIOT trapIdentifier removedIllegal InstructionIllegal instructionIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInput/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKilledLevel 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink has been severedLink number out of rangeLocal domain name not setLocal resource allocation failureMachine is not on the networkMemory exhaustedMessage too longMultihop attemptedNIS client/server version mismatch - can't supply serviceNIS map data base is badName not unique on networkNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNot a XENIX named type fileNot a directoryNumerical argument out of domainNumerical result out of rangeObject is remoteOdd number of quotation marksOperation already in progressOperation not permittedOperation not supportedOperation not supported by deviceOperation now in progressOperation would blockOut of streams resourcesPackage not installedPermission deniedPower failurePremature end of regular expressionProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRTLD_NEXT used in code not dynamically loadedRead-only file systemRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableSegmentation faultServer rejected credentialServer rejected verifierSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSrmount errorStack faultStale NFS file handleStoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSystem resource allocation failureTerminatedText file busyTimer expiredToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/BPT trapTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' for more information. +-Trying %s... +-Unknown .netrc keyword %sUnknown NIS error codeUnknown error Unknown hostUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage: %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 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWritten by %s. +-Wrong medium typeYPBINDPROC_DOMAIN: %s +-You really blew it this timeZone 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 characterargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problembad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twicebogus mcheck_status, library is buggybroadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)cache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot opencannot open database file `%s': %scannot 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 specificationcannot 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 happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_raw.c - Fatal header serialization error.collation element `%.*s' appears more than once: ignore linecollation symbol `%.*s' appears more than once: ignore linecollation 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 founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoend point of ellipsis range is bigger then starterror while inserting collation element into hash tableerror while inserting to hash tableexpect string argument for `copy'expected continuation line not foundfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfrom-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal names for character rangeillegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincorrectly formatted fileinput line of unknown typeinternal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid GMT offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday nameline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmemory clobbered before allocated blockmemory clobbered past end of allocated blockmemory exhaustedmemory exhausted +-memory is consistent, library is buggymissing era format in string %d in `era' field in category `%s'missing era name in string %d in `era' field in category `%s'nameless rulenever registered prog %d +-no correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular fileonly WIDTH definitions are allowed to follow the CHARMAP definitionproblems 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 momentrpcinfo: %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 portmapperrpcinfo: can't contact portmapper: same rule name in multiple filesselect: protocol failure in circuit setup +-socket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp: makefd_xprt: out of memory +-svctcp_.c - cannot getsockname or listensvctcp_.c - udp socket creation problemsvctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: socket creation problemsymbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectionthis is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limituse of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127values for field `%s' in category `%s' must not be zerowhile opening UTMP filewhile opening old catalog filewhile preparing outputwhile reading databasewhile writing database filewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone lineyp_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 +-Language-Team: Greek +-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: ðñÝðåé íá åßíáé ìåãáëýôåñï ôïõ +-%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; ãéáôß = Ï ÷áñáêôÞñáò äåí ðñÝðåé íá åßíáé óôçí êëÜóç `%s'Ï ÷áñáêôÞñáò äåí åßíáé óôçí êëÜóç `%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: Ìç óõìâáôÝò åêäüóåéò ôïõ RPCRPC: Áðïôõ÷ßá áíôéóôïé÷Ýá èõñþíRPC: Ìç äéáèÝóéìç äéáäéêáóßáRPC: Ôï ðñüãñáììá äåí Ý÷åé êáôá÷ùñçèåßRPC: Ìç äéáèÝóéìï ðñüãñáììáRPC: Áíáíôéóôïé÷åßá ðñüãñáììáôïò/ÝêäïóçòRPC: ÓöÜëìá áðïìáêñõíóìÝíïõ óõóôÞìáôïòRPC: Ï äéáêïìéóôÞò äåí ìðïñåß íá áðïêùäéêïðïéÞóåé ôéò ðáñáìÝôñïõòRPC: Åðéôõ÷ßáRPC: ËÞîç ÷ñüíïõRPC: Áäõíáìßá ëÞøçòRPC: Áäõíáìßá áðïóôïëÞòRPC: ¶ãíùóôï üíïìá óõóôÞìáôïòRPC: ¶ãíùóôï ðñùôüêïëïÔï RTLD_NEXT ðïõ ÷ñçóéìïðïéåßôáé óôïí êþäéêá äåí öïñôþèçêå äõíáìéêÜÁíáãíþóéìï-ìüíï óýóôçìá áñ÷åßùíÐïëý ìåãÜëç êáíïíéêÞ ÝêöñáóçÁðïìáêñõóìÝíï óöÜëìá åéóüäïõ/åîüäïõÇ áðïìáêñõóìÝíç äéåýèõíóç ÜëëáîåÁðïìáêñýíåôå ôï óõíèçìáôéêü Þ êÜíôå ôï áñ÷åßï ìç-áíáãíþóéìï áðü ôïõò Üëëïõò.ÁíáöÝñáôå óöÜëìáôá ÷ñçóéìïðïéþíôáò ôï `glibcbug' ðñüãñáììá óôï . +-ÊáêÞ áßôçóç ðáñáìÝôñùíÓöÜëìá áíáëõôÞ äéåõèýíóåùí 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'ï ÷áñáêôÞñáò äåí ïñßóôçêå óôïí ÷Üñôç ÷áñáêôÞñùíï ÷áñáêôÞñáò `%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 momentrpcinfo: %s åßíáé Üãíùóôï óýóôçìá +-rpcinfo: %s åßíáé Üãíùóôç õðçñåóßá +-rpcinfo: Áäõíáìßá äéáãñáöÞò äÞëùóçò ãéá ôï ðñüãñáììá %s Ýêäïóçò %s +-rpcinfo: åêðïìðÞ áðÝôõ÷å: %s +-rpcinfo: áäõíáìßá åðéêïéíùíßáò ìå äéá÷åéñéóôÞ èõñþírpcinfo: áäõíáìßá åðéêïéíùíßáò ìå äéá÷åéñéóôÞ èõñþí: ï ßäéïò êáíüíáò óå ðïëëáðëÜ áñ÷åßáselect: áðïôõ÷ßá ðñùôïêüëïõ óôï óôÞóéìï êõêëþìáôïò +-socket: áðïôõ÷ßá ðñùôïêüëïõ óôï óôÞóéìï êõêëþìáôïò +-Ïé êáôåõèýíóåéò ôáîéíüìçóçò `forward' êáé `backward' åßíáé áìïéâáßá áðïêëåéþìåíåòÔá ÷áñáêôçñéóôéêÜ ôçò âáñýôçôáò ôáîéíüìéóçò ãéá óýìâïëï ðáñáâïëÞò äåí âãÜæåé íüçìáêáíïíéêÞ åßóïäïòêáíïíéêÞ Ýîïäïòç çìåñïìçíßá Ýíáñîçò äåí åßíáé Ýãêõñç óôï áëöáñéèìéôéêü %d óôï ðåäßï `era' óôçí êáôçãïñßá `%s'ôï Ýôïò Ýíáñîçò åßíáé ìåãáëýôåñïò ôï Ýôïò ôåñìáôéóìïýï ÷ñüíïò Ýíáñîçò åßíáé ðïëý ìåãÜëïò ãéá íá áíáðáñáóôáèåßï ÷ñüíïò Ýíáñîçò åßíáé ðïëý ìéêñüò ãéá íá áíáðáñáóôáèåßç çìåñïìçíßá ôåñìáôéóìïý äåí åßíáé Ýãêõñç óôçí áëõóßäá %d óôï ðåäßï `era' óôçí êáôçãïñßá `%s'svc_run: - áðïôõ÷ßá ôïõ selectsvc_tcp: makefd_xprt: ìíÞìç åîáíôëÞèçêå +-svctcp_.c - áäõíáìßá getsockname Þ listensvctcp_.c - ðñüâëçìá äçìéïõñãßáò õðïäï÷Þò udpsvctcp_create: ìíÞìç åîáíôëÞèçêå +-svcudp_create - áäõíáìßá getsocknamesvcudp_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' äåí ðñÝðåé íá åßíáé êåíü áëöáñéèìéôéêüç ôéìÞ ôïõ ðñÝðåé íá åßíáé ìåãáëýôåñç ôçò ôéìÞò ôïõ ç ôéìÞ ôïõ ðåäßïõ `int_curr_symbol' óôçí êáôçãïñßá `LC_MONETARY' äåíóõìöùíåß ìå Ýãêõñï üíïìá óýìöùíá ìå ôï ISO 4217ç ôéìÞ ôïõ ðåäßïõ `int_curr_symbol' óôçí êáôçãïñßá `LC_MONETARY' Ý÷åé ëÜèïò ìÞêïòïé ôéìÝò ãéá ôï ðåäßï `%s' óôçí êáôçãïñßá `%s' ðñÝðåé íá åßíáé ìéêñüôåñåò ôïõ 127ïé ôéìÝò ãéá ôï ðåäßï `%s' óôçí êáôçãïñßá `%s' äåí ðñÝðåé íá åßíáé ìçäÝíêáôÜ ôï Üíïéãìá ôïõ UTMP áñ÷åßïõêáôÜ ôï Üíïéãìá ðáëéïý áñ÷åßïõ êáôáëüãïõêáôÜ ôçí ðñïåôïéìáóßá åîüäïõêáôÜ ôçí áíÜãíùóç âÜóåùò äåäïìÝíùíêáôÜ ôçí åããñáöÞ áñ÷åßïõ âÜóåùò äåäïìÝíùíôï áñ÷åßï åßíáé åããñÜøéìï êáé áðü Üëëïõò åêôüò ôïõ éäéïêôÞôçëÜèïò áñéèìüò ðáñáìÝôñùíëÜèïò áñéèìüò ðåäßùí óôç ãñáììÞ LeapëÜèïò áñéèìüò ðåäßùí óôç ãñáììÞ LinkëÜèïò áñéèìüò ðåäßùí óôç ãñáììÞ RuleëÜèïò áñéèìüò ðåäßùí óôç ãñáììÞ ðáñÜôáóçò ZoneëÜèïò áñéèìüò ðåäßùí óôç ãñáììÞ Zoneyp_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ôKMLEUL&›L(ÂLëLüLM&M5MIMdM~Mn’MOO"%O"HOkO:‡OÂOËOÔOêOPP2PLPePPšP¶PÐPíPQ#Q*Q EQRQYQ3kQ3ŸQ4ÓQ.R%7R]R&qR%˜R¾R%ÕR3ûR,/S)\S†S"ŸS!ÂSäSûST.TDT"ZT*}T¨T&ÂT&éT&U&7U&^U…U U$¾UãUþUV,2V_V%}V,£V-ÐV þV&WFWeW„WžW²WÒW‰òW2|X¯X"ÊX4íX"Y#4Y XY=bY Y<±YîY'Z6Z)?Z(iZ ’Z³ZµZ½Z$ÎZóZ) +-[(4[][ m[y[#[/´[ä[ö[ \ \%\9\ N\Z\j\\ ›\¨\¾\ Õ\ á\ë\ï\ ]&]-<]!j]Œ]ª]È]ß]&ÿ]%&^0L^!}^Ÿ^-·^å^%_)(_'R_%z_& _Ç_ã_ ý_ +-`%`<`X`u`@Ž`DÏ`a'a@a Ua=_aaÇ·ab7žb2Öb- c7c$Jc +-oczc€c!„c¦c·cÐcícdd/dJd^drd3†d-ºd2ède,e5e;jzjƒj‡jšj!®j Ðj!Ýjÿj.kMk ak nk"{kžk±kÄk Úkäk+ük(lElVlmlŠl¤l¼lØlðl +-m1m$Mmrm„mŸm´mÏm çmômn +-n#n*n20ncnrn‹n šn¨nÄnÚnón oo!3oUosos“op*pCp]pnppžp±pÅpÝpópq qq9qVqnq„q,q +-ÊqÕq Üqéqr#r>rXrprr#¢rÆrÖrírs#&sJsjssss s²sÊsÝsæsöst1tPtptt™t¨tÂtÕtôtu*#uNuUumu‰u ™u!£u ÅuÏuéu v"v @vMvavrvƒv v(¾vçvww5wOwew~wŽw w´w½wÓwãw.ów"x 4x#Bx0fx%—x½xÑxçxøx y#y@yOymy„y›yºyØyÝyðyz+zEz_zqzƒzz·zÐzìz! {.{G{b{~{—{µ{"Î{ ñ{þ{ |$|8|J|`|-o|-|!Ë|í|}}2}C}2Z}#} ±}¾};Ò}~$~@~X~ r~ €~¡~¿~Ð~Ö~ð~/J&cŠŸ´½Ü ö€$0€ U€ c€o€…€š€²€º€Ë€߀ô€ *((S |‰"ƒÀD‚K‚$e‚ +-Š‚•‚«¤‚P„ `„n„!‚„¤„³„Ç„å„"ø„…*…@…S…'c…#‹…6¯… æ… +-ô…ÿ…"†"*†M†"g†Š†ª†ĆÛ† ñ†ÿ† ‡‡*‡C‡Z‡o‡‡–‡«‡½‡χ á‡î‡ ˆˆ#%ˆ:Iˆ„ˆšˆ%°ˆÖˆ"숉!‰ @‰"a‰ „‰¥‰¿‰ωá‰æ‰ë‰Š!ŠF>Š …Š.Š-¾Š6ìŠ8#‹;\‹I˜‹â‹ú‹Œ+$Œ+PŒ'|Œ¤Œ ÄŒ ьیùŒ&(.O&~¥,µâŽCŽ#aŽ…Ž¤Ž!ÀŽ"âŽ. 4%U;{&·Þ1þ0 KW"h‹'§Ïç.‘3‘"J‘(m‘-–‘Ä‘Ü‘!ù‘’8’X’t’!’²’Ê’æ’9ý’47“8l“+¥“8Ñ“$ +-”"/”!R”.t”£””á”<•;>•$z•Ÿ•·•*ו7–:–"Y–|–)–N¹–U—^—&|—)£— Í—Û—+ô— ˜>˜X˜j˜"Š˜%­˜*Ó˜*þ˜)™=™0W™ˆ™§™+Ç™7ó™#+šOš!mš$š!´šÖš&ñš%›,>›k›'z›%¢›0È›2ù› ,œ.9œhœKœLÍœLg+{2§2Ú/ ž$=žbž%xž-žž$Ìžñž Ÿ'Ÿ:Ÿ(QŸ&zŸ!¡ŸßFÚŸ! B4 Bw ?º <ú 77¡o¡Š¡#¥¡.É¡0ø¡0)¢Z¢x¢‹¢§¢¼¢Тå¢ÿ¢£%£;£O£#d£5ˆ£G¾£ ¤#¤58¤ n¤{¤-’¤!À¤(â¤- ¥9¥J¥'\¥?„¥=Ä¥ ¦.¦ ?¦9`¦;š¦,Ö¦*§#.§R§%l§A’§Ô§ñ§I¨7X¨3¨+Ĩð¨'©!/©Q©.b©‘©C¤©*è© ªª(8ªaª1tª¦ªÁª:ݪ«)6«*`«#‹«¯«$Ï«ô«¬",¬O¬m¬‡¬¤¬>Ĭ­!"­ D­(e­$Ž­³­*É­=ô­H2®{®Š®Eš®&à®(¯'0¯EX¯ž¯(·¯'à¯$°,-°)Z°%„°ª°"È°ë°& ±0±PO±V ±U÷±OM²V²!ô²'³*>³/i³*™³$ij/é³1´/K´){´*¥´)д#ú´µ-9µ&gµ4Žµ(õìµ ¶ ¶#(¶$L¶"q¶”¶ª¶ĶÛ¶.춷;·3X·Œ·#ž·· Û·å·0ü·-¸$I¸n¸‡¸#˜¸ ¼¸ȸݸñ¸¹)¹4B¹w¹Š¹§¹'ǹBï¹D2ºjwº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Ê3KÊ3Ê3³ÊçÊ0Ë+3Ë"_Ë‚Ë›Ë0¶ËçË)Ì00Ì1aÌ!“Ì)µÌ!ßÌÍ!Í@Í VÍ wÍž˜Í@7ÎxÎ5—Î>ÍÎ Ï+"ÏNÏIbϬÏL¿Ï+ Ð*8Ð +-cÐAnÐ/°Ð)àÐ +-Ñ ÑÑ:+ÑfÑ<…Ñ>ÂÑÒ Ò)Ò&IÒ8pÒ©ÒÀÒÙÒêÒÿÒ$ÓBÓRÓmÓ1‰Ó»Ó%ËÓ%ñÓ Ô $Ô2Ô#6ÔZÔ9oÔG©Ô1ñÔ0#Õ0TÕ…Õ+ ÕEÌÕ;Ö=NÖ/ŒÖ ¼Ö;ÝÖ(×>B×5×5·×+í×?ØYØxØ–Ø-®ØÜØóØ$Ù-8ÙSfÙXºÙÚ-%ÚSÚpÚKyÚÅÚÙåÚ,¿ÛPìÛ0=ÜBnܱÜ-ÈÜ öÜÝÝ( Ý5Ý%SÝ+yÝ ¥ÝÆÝáÝÿÝÞ.Þ JÞ9kÞ=¥ÞAãÞ"%ß HßVß_ß"oß’ßK­ßùß,à7Eà}à à5°àGæà.á#Lápá'‚á!ªá'Ìáôá â+â8Fââ—â$žâ«Ãâoã-Šã¸ãÓãêãþãä'&ä0Nää-ä3½ä.ñä/ å3På„å å¿åSÚå .æ<æ @æaætæ”æ&ªæ.Ñæ4ç5ç MçZç,oçœç´çÉç áçîç=è!Lènèè$¡è"Æè!éè é&é.Aépé?…é+Åéñé ê)ê.Gê"vê™ê«ê¼ê Úêäê÷ê@ÿê@ëQëiëzë#ë³ëËëëëì0ì,Hìuì#ì’³ìFíBZí!í¿íÏí$çí î&î'?îgî†î¤î«îºîd¾î/#ïSï)nï7˜ïÐïæïíï(üï#%ðIðið!‡ð$©ðÎð-ìðñ0ñ%Fñ%lñ.’ñ.Áñðñ(ò-òHò+aò"ò°òÌòéò( ó,2ó*_ó&Šó"±óÔó$îóô.3ôbô4xô/­ô Ýô$çô' õ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}!œ"¾&á )<'Dl)Š´0Ñ!&H^v}%”%ºà#þ +-"0-5^”¦.¿¶î¥¬*Æ ñ ûÝú +(@i|*™Ä,Ø ' "A d !~ 0  8Ñ  +- +- +- +- ' +-(3 +-)\ +-'† +-+® +-#Ú +-&þ +-% > ] o ‚ • ¨ -Å ó  ' ,E r ˆ ž ´ Å á ú - +- I8 ‚ ¢ 5 &ø -MAd.¦3Õ7 )Ak|’—œ#³×\ó P.]@ŒQÍ@H`f©(A1U1‡:¹!ô(#?!c…> 4ß3H=`:ž%ÙPÿ1P7‚5º'ð(;A1}6¯Iæ10.bE‘,×.-,\:‰&Ä+ëB!Z3|;°Aì.$K,p+#É*í51N%€*¦Ñ?ñ?1Aq;³Kï);,e5’4È ý !?MaD¯)ô,;)hJ’!Ý/ÿ/ DG bŒ hï !X!*z!(¥!Î! Þ!4ÿ!"4"W"s"/Ž"(¾"3ç">#<Z#—#¶#IÖ# $$@$2e$C˜$&Ü$%:%1W%)‰%%³%:Ù%*&2?&r&3&4µ&4ê&N'n'E'#Å'jé'fT(d»( )2<)8o)=¨)0æ)2*"J*9m*;§*ã*"+#+<+$N+>s+.²+1á+,V+,‚,Oœ,Mì,J:-J…-DÐ-".$8.!].;.=».=ù.7/U/!q/“/¨/¾/Ô/ð/ 0)0B0&X0>0O¾0[1j1.€1H¯1ø1+ 2B52/x26¨2@ß2 3036A3Nx3PÇ34:)4"d4D‡4FÌ4559I5$ƒ5'¨50Ð5P6(R6"{6lž6? 7LK7M˜7-æ7E80Z8‹8<¤8á8Iü8>F9…9—93´9è99:'::b:W‚:#Ú:/þ:3.;7b;0š;8Ë;<"<5><8t<­<%É<)ï<F=*`=:‹=(Æ=?ï=5/> e>5†>=¼>Mú>H?Y?Si?&½?:ä?:@PZ@«@AÃ@-A&3A2ZABA'ÐAøA6BOB/oB ŸBeÀB_&C^†C^åCtDD,¹D/æD3E?JE5ŠE.ÀE9ïEA)FBkF9®F7èF8 G/YG#‰G7­G8åGLH;kH0§HØHëH<I0?I)pI šI»IÚIöI; J(EJ+nJ:šJÕJ4ëJ# K DKPK<jK$§K1ÌKþKL,8LeLuL!ŠL$¬LÑLïL? M'KM!sM/•M)ÅMDïMI4Nu~N]ôNMRO O.»O5êO, P'MPuP‹P;§PãPQ5QKQ:kQ8¦Q;ßQFR6bR™R¹RFÙR; SÙkÝß@,Œ(Èø:CØ÷p}Õë2ÑëkD†!aSqäJw7ºý@„EVH¿sèlsŠu[¢vË©á: ã6=u‚ño.£ |dãpÔ9™$–[¥l?úC`ŒŒ‡*€X9IÊSVp!Ò…ydá‡þ£בQò1õÂn^ +- m4·¨?îm³rŠþ]„ý‚Ì#´/_JÄœsfQ8årÍz•ƒ<ÖxB{Kˆå>÷DM¢œùÓ>·ÇoiÃ@xµûb ¶ga„Eoe-xWØ؃ZsR"ˆ4/îÁ*Û(äÇ…1 kLVÌN)²‰Ay¹*íf$XQ)#K¤ûÕ[qDáè½TaÄ.ÜùT,'ûu\àê!3ë‹g +-=H]Ó-5Oz»ßj«¬Ú ƒõôïí¿®Á”.¯ø†G’jJZ„R™›C¯3ÿÆ%e`«Ô¡ÉUm{QcP˜«¾òÀƺ6rÍ`ÿ³tôe5‹Fh|›§ìbܱ²ÈeÙ\~2E j¼#š þmÅy ¶1Mö\»4fR ¨×7YŠfL˜FΠª ‰<È¥  Ú’³{iYÏãç÷ %ÿ§(cŽÒ~,Ÿ{é‚ ñC5"Ñ?Ðv)…? +-+/~_"}W|ÛÉdµ¡O"=™R¤Lݽ@uÄ7^ý®8P‡Ãªy` <w}_¨'HdÑnš®ïH”GŽ5>+SÕ-Ý­Yú!©¾Iõgl¼^zßÒvžÞ¹öͤNA|ôtWÏ·+ðƒ$3h̪cèŒb&A´ib[ ¦8Û“ÞOàÔo×Y#róN0——í;n°Ü%‚ñó¼Ëžð E K +-M꿬âh¬XTt ¾^ü9‹M J”âµ>+Š(ì2c±‘6&£œV)†ü›¡¦úU=B•“º;véÊì0Ë€ZüÊï%ɯâ½~]ಘð1¶Np2i':0-DÅ°¸S­ÚÖWL8Óꦟî}¹ç,ø°¸Ðtäö&‘Bw†ælÏIæó‹å6'“ÎçUÙ‰À:*øF‰»– n.…q7éx/Þw;ŸÇž’À&§´G;TZF©g4ˆqò_OKP\–Æ—X•IzÅÂÁ‡G0aAˆBæjUù­€€š<$Ðk¥¢ÎÖ]PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Spanish +-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: %sla línea "Zone %s" y la opción -l son mutuamente excluyentesla línea "Zone %s" y la opción -p son mutuamente excluyentesse 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: debe ser más grande que +-%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 caracteresEl carácter no debe estar en la clase `%s'El carácter no está en la clase `%s'?AbortadoDerechos de acceso : Accediendo a una biblioteca compartida que está corrompidaLa dirección ya se está usandoEsta familia de direcciones no está soportada para el `host'Esta familia de direcciones no está soportada por el protocoloError de anuncioTemporizadorLa lista de argumentos es demasiado largaSe intentó eliminar una tabla no vacíaSe intentaron enlazar demasiadas bibliotecas compartidasAutentificación válidaError de autentificaciónOBJETO INVÁLIDO +-Dirección incorrectaDescriptor de fichero erróneoFormato de fichero fuente incorrectoMensaje erróneoLlamada al sistema erróneaValor erróneo para ai_flagsActúa estrictamente de acuerdo con la norma POSIXDatos binarios +-Se requiere un dispositivo de bloquesProblema en el `poll' del `broadcast'Tubería rotaError del busCDSRebasado el límite de tiempo de CPUEl caché ha expiradoNo se puede acceder a una biblioteca compartida necesariaHa fallado la llamada a bind() con el servidor que sirve a este dominioNo se puede comunicar con el asignador de puertosNo se puede establecer comunicación con `ypbind'No se puede establecer comunicación con `ypserv'No se pudo asignar memoriaNo se puede asignar la dirección solicitadaNo se puede crear `socket' para enviar un mensaje `broadcast' del rpcNo se puede ejecutar una biblioteca compartida directamenteNo 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 servicioNo se puede enviar tras la destrucción del punto de destinoNo 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 rangoSeparador de Caracteres : %c +-El proceso hijo terminóLas credenciales del cliente son poco fiablesColumnas : +-Error de comunicación al enviarCompila una especificación de localeAnda, vete a casa y tómate un vasito de lecheEl 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 rehusadaConexión reinicializada por la máquina remotaExpiró el tiempo de conexiónContinúaConvierte la codificación de los ficheros dados de una codificación a otra.Convierte la clave a minúsculasCopyright (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ímbolosCrea la salida incluso si hubo mensajes de avisoCrea una base de datos DB simple a partir de una entrada de texto.Fecha de creación : %sLa entrada DES para el nombre %s no es única +-DIRECTORIO +-DNANSDNSNo existe la base de datos para la tablaLa base de datos está ocupadaDerechos de acceso predeterminados : +-Se debe especificar la dirección de destinoEl dispositivo no es un `stream'Dispositivo no configuradoDispositivo o recurso ocupadoDiffie-Hellmann (%d bits) +-Directorio : %s +-El directorio no está vacíoSe ha excedido la cuota de discoNo se divide y muestra los mensajes en la terminal actualNo muestra ningún mensaje mientras construye la base de datosNo utiliza el catálogo existente, crea un nuevo fichero de salidaNo se pudo conectar con el dominio`trap' de EMTENTRADA +-Datos cifrados +-Discordancia de tipo Entrada/TablaError en el subsistema RPCError 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 llenoFormato de ejecutable incorrectoError fatal: el sistema no define `_POSIX2_LOCALEDEF'El FICHERO contiene una asignación de nombres simbólicos a valores UCS4Falló (error no especificado)Descriptor de fichero en mal estadoEl fichero existeerror `deadlock' al bloquear el ficheroNombre de fichero demasiado largoSuperado el límite de tamaño de ficheroFichero demasiado grandeCadena Primero/Siguiente rotaExcepción de coma flotanteSe necesita una resincronización completa del directorioFunción no implementadaGRUPO +-Inconsistencias en ARGP_HELP_FMT: %sGenera 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éricoObtiene la información específica del locale.Da un mensaje corto de usoDa esta lista de ayudaError injustificadoGrupo : %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 grupoNo se ha encontrado "%d" en el caché de contraseñasNo se ha encontrado "%s" en el caché de gruposNo se ha encontrado "%s" en el caché de `hosts'No se ha encontrado "%s" en el caché de contraseñasEl `host' no está operativoNombre de `host' no encontradoOperación de E/S permitidaFICHERO-ENTRADA FICHERO-SALIDA +--o FICHERO-SALIDA FICHERO-ENTRADA +--u FICHERO-ENTRADA`trap' de IOTIVYEl identificador se ha eliminadoInstrucción ilegalObjeto ilegal para la operaciónDesplazamiento ilegalFormato o tipo de fichero no apropiadoFunción ioctl no apropiada para el dispositivoOperación no válida para un proceso en segundo planoPetición de informaciónInformación:Ficheros de Entrada:Especificación de formato de Entrada/Salida:Error de entrada/salidaError interno de NISError interno en ypbindInterrupciónLlamada al sistema interrumpidaLa llamada al sistema interrumpida debería volverse a iniciarObjeto inválido para la operaciónArgumento inválidoReferencia hacia atrás inválidaNombre de clase de carácter inválidoCredenciales del cliente inválidasVerificación del cliente inválidaCarácter de unión inválidoContenido de \{\} inválidoEnlace cruzado entre dispositivos no permitidoIntercambio inválidoEl carácter multibyte o extendido está incompleto o es inválidoLa expresión regular precedente es inválidaFinal de rango inválidoLa expresión regular es erróneaCódigo de petición incorrectoEl descriptor de fichero solicitado es erróneoVerificación del servidor inválido`slot' incorrectoEs un directorioEs 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 detenidoNivel 2 no sincronizadoNivel 3 detenidoNivel 3 restablecidoEn enlace apunta a un nombre ilegalEl enlace se ha cortadoNúmero de enlace fuera de rangoTipo de objeto enlazado : Enlazado a : %s +-No se ha establecido el nombre del dominio localLa asignación de recursos locales ha falladoLa máquina no está en redNombre mal escrito, o nombre ilegalLos 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 memoriaMemoria agotadaMensaje demasiado largoFalta un atributo o está mal escritoFecha de modificación: %sFallo en la modificaciónLa operación de modificación ha falladoModifica el formato de salida:Se ha intentado un `multihop'NOMBRENOMBRE +-[-a|-m]NISDiscordancia 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 correctaFalló la operación de NIS+No se puede acceder a los servidores NIS+El servicio NIS+ no está disponible o no está instaladoNO HAY NINGÚN OBJETO +-NÚMERONombre : `%s' +-Daemon de Caché del Servicio de Nombres.Nombre no servido por este servidorEl nombre no es único en la redNombre o servicio desconocidoEl par nombre/entrada no es únicoEl objeto nombrado no es localizableSe necesita un autentificadorLa conexión de red se perdió al reinicializarLa red no está activaLa red es inaccesibleNo quedan estructuras CSI disponiblesNo quedan semáforos XENIX disponiblesNo existe ninguna dirección asociada al nombreNo existe ninguna dirección asociada al nombreNo hay ningún ánodoNo queda espacio para memoria intermediaNo hay ningún proceso hijoNo hay datos disponiblesNo queda espacio de ficheros en el servidorNo se pueden bloquear más ficherosNo hay ninguna coincidenciaNo se ha encontrado el medioNingún mensaje del tipo deseadoNo hay más registros en la base de datosNo existe ninguna expresión regular anteriorNo hay ningún programa remoto registrado. +-No existe ninguna ruta hasta el `host'No queda espacio en el dispositivoNo existe tal dispositivoNo existe el fichero o el directorioNo exite esta clave en la tablaNo existe esa tabla en el dominio del servidorNo existe tal procesoSe ha encontrado un nombre de espacio que no es NIS+Fallo irrecuperable en la resolución del nombreNinguno. +-No se encontró, no existe ese nombreNo es un fichero XENIX del tipo `named'No es un directorioNo se ha encontradoNo existe un servidor maestro para este dominioNo es el propietarioNúmero de Columnas : %d +-Número de objetos : %u +-Argumento numérico fuera del dominio de la funciónResultado numérico fuera de rangoObjeto #%d: +-Nombre del Objeto : %s +-Tipo del Objeto : El objeto es remotoExiste un objeto con el mismo nombreNúmero impar de comillasSolamente root puede usar esta opciónLa operación ya se está llevando a caboOperación no permitidaLa operación no está soportadaOperación en cursoLa operación se bloquearíaAlcanzado el límite de recursos de `streams'Control del resultado:Selección del resultado:Propietario : %s +-PRIVADO +-El paquete no está instaladoError de análisis: %sÉxito parcialEl objeto pasado no es el mismo objeto que hay en el servidorPermiso denegadoFallo de alimentaciónFin no esperado de la expresión regularMuestra el contenido de un fichero de base de datos, una entrada por líneaMuestra una estadística sobre la configuración actualMuestra más mensajesMuestra la versión del programaÉxito probableProbablemente no se encontróEl tiempo de CPU expiróProtocolo no disponibleError de protocoloFamilia de protocolos no soportadaProtocolo no disponibleProtocolo no soportadoTipo de protocolo incorrecto para el `socket'Consulta ilegal para la tabla nombradaAbandonaerror específico de RFSRPC: procedimiento erróneo para el programaFallo RPC en una operación NISPrograma RPC no disponibleVersión del programa RPC incorrectala estructura RPC es incorrectaversión de RPC incorrectaRPC: (código de error desconocido)RPC: Error de autentificaciónRPC: No se pudo descodificar la respuestaRPC: No se pudieron codificar los argumentosRPC: Falló (error no especificado)RPC: Versiones incompatibles de RPCRPC: Fallo del asignador de puertosRPC: Procedimiento no disponibleRPC: Programa no registradoRPC: Programa no disponibleRPC: La versión del programa no coincideRPC: Error del sistema remotoRPC: El servidor no puede descifrar los argumentosRPC: ConseguidoRPC: El tiempo expiróRPC: No se puede recibirRPC: No se puede enviarRPC: `Host' desconocidoRPC: Protocolo desconocidoRSA (%d bits) +-Se ha usado RTLD_NEXT en una parte del código que no se cargó dinámicamenteLee y visualiza los datos de `profiling' del objeto compartidoLee datos de configuración de NOMBRESistema de ficheros de sólo lecturaSeñal de tiempo real %dLa expresión regular es demasiado grandeError de E/S en la máquina remotaLa dirección remota ha cambiadoElimine 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 . +-Los argumentos de la petición son incorrectosError del determinador de nombres 0 (ningún error)Error interno del determinador de nombresSe ha evitado un bloqueo de recursosRecurso perdidoRecurso no disponible temporalmenteResultados enviados al proceso de `callback'SHOBJ [DATOSPROF]SUNYPRuta de búsqueda : %s +-Violación de segmentoEl servidor está ocupado, inténtelo de nuevoMemoria agotada en el servidorEl servidor rechazó la credencialEl servidor rechazó el verificadorNo se admite servname para ai_socktypeEstablece el nombre del programaApagar el servidorSeñal 0Operación de `socket' en un `no-socket'Tipo de `socket' no soportadoEl programa provocó el fin de la conexiónLo siento. Usted no es root +-Las definiciones fuente se encuentran en FICHEROError de `srmount'Fallo en la pila`handle' de fichero NFS en desusoComienza NÚMERO hilosEstado : %s +-ParadoParado (por una señal)Parado (requiere entrada de terminal)Parado (requiere salida por terminal)Error de tubería de `streams'La estructura necesita una limpiezaConseguidoSuprime los avisos y los mensajes de informaciónNombres simbólicos de caracteres definidos en FICHEROError del sistemaInformación del sistema:Fallo en la asignación de recursos del sistemaDirectorio del sistema para asignaciones de caracteres : %s +- asignaciones de repertorios: %s +- ruta de búsqueda de locales: %s +-%sTABLA +-Tipo de Tabla : %s +-Fallo temporal en la resolución del nombreTerminadoEl fichero de texto está ocupadoLa 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 finalDemasiados atributosDemasiados niveles de enlaces simbólicosDemasiados enlacesDemasiados ficheros abiertosDemasiados ficheros abiertos en el sistemaDemasiados procesosDemasiadas referencias: no se pueden solaparDemasiados usuarios`trap' para punto de parada/seguimientoBarra invertida extra al final `\'El traductor ha terminadoEl otro extremo ya está conectadoEl otro extremo de la conexión no está conectadoPruebe `%s --help' o `%s --usage' para más información. +-Intentando %s... +-Tipo : %s +-DESCONOCIDONo se puede autentificar el cliente NIS+No se puede autentificar el servidor NIS+No se puede crear la llamada de regresoNo se puede crear el proceso en el servidorDesconocido (tipo = %d, bits = %d) +-Palabra clave %s desconocida en .netrcError de NIS desconocidoBase de datos desconocida: %s +-Error desconocidoError desconocido `Host' desconocidoObjeto desconocidoOpción desconocida: %s %s %sError del determinador de nombres desconocidoError del servidor desconocidoSeñal desconocida %dError del sistema desconocidoError desconocido en la llamada a `ypbind()'( ó \( desemparejados) ó \) desemparejados[ ó ^[ desemparejados\{ desemparejadoVariable no reconocida `%s'Condición urgente de E/SModo 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 1Señal definida por el usuario 2Valor demasiado grande para el tipo de datos definidoEl temporizador virtual llegó al finalResultado salvaje en la ejecución de la ordenLa ventana ha cambiadoEscribe los nombres de las asignaciones de caracteres disponiblesEscribe los nombres de los locales disponiblesEscribe los nombres de las categorías seleccionadasEscribe los nombres de las palabras clave seleccionadasEscribe el resultado en el fichero NOMBREEscrito por %s. +-Tipo de medio erróneoX500XCHSYPBINDPROC_DOMAIN: %s +-Sí, 42 es el significado de la vidaEsta vez sí que lo has rotoLa 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 desconocidoNo se admite ai_familiyNo se admite ai_socktypeya está funcionandoel argumento para <%s> debe ser un único carácterel argumento para `%s' debe ser un único carácterauth_none.c - Problema muy grave con autorización marshallauthunix_create: memoria agotada +-Argumento erróneopropietario incorrectoCampo 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úfercache_set: no se pudo asignar espacio para un nuevo búfer rpccache_set: falló la asignación de espacio para el objetivocache_set: no se encontró el objetivoNo se puede determinar la abreviación de zona horaria que se usará justo +-despuésno 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ímbolono se puede crear un descriptor internono se pueden crear descriptores internosno se puede activar el `socket' para aceptar conexiones: %sno 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 %dno se puede insertar el elemento de unión `%.*s' no se puede insertar el la tabla de resultadosno se puede insertar la nueva definición para el símbolo de unión: %sno se pueden cargar los datos de `profiling'no se puede abrirno se puede abrir `%s'no se puede abrir el fichero de datos `%s': %sno 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 salidano 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': %sno se pueden procesar las especificaciones de ordenno se puede leer el directorio de tablas de caracteres `%s'no se puede leer el fichero de configuración; este error es fatalno se puede leer del clienteno se puede leer la cabecera de `%s'No se puede leer el directorio de locales %sno se puede leer el fichero de locales `%s'no se puede leer la asignación `%s'no se pueden leer los datos de estadísticano se puede ejecutar stat() sobre el fichero `%s': %sno se puede escribir en el fichero de salida `%s'no se puede escribir el resultado: %sno se pueden escribir las estadísticas: %sno se puede escribir al clientecategoría de datos reclamada más de una vez, no debería ocurrirel 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 `%sel carácter no está definido en la tabla de caracteresel carácter `%s' no está definido cuando se necesitó como valor por defectola clase de carácter `%s' ya fue definidala tabla de caracteres `%s' ya está definidael fichero de tabla de caracteres `%s' no se encontróclnt_raw.c - Error grave en la secuencia de cabeceraclnttcp_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íneasímbolo de unión `%.*s' aparece más de una vez: descartando la líneasímbolo de unión esperado después de `%s'conexión a la dirección %s: se esperaba una constante o un identificadorno se admite la conversión de `%s' a `%s'la conversión se ha detenido debido a un problema al escribir el resultadono 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ácternombre de carácter duplicado `%s'definición duplicada del elemento de unióndefinición duplicada del carácter `%.*s'clave duplicadadefinición de conjunto duplicadanombre de zona %s duplicado (fichero "%s", línea %d)identificador de mensaje duplicadonúmero de mensaje duplicadocadena de caracteres vacíanombre de peso vacío: la línea se pasa por altoenablecache: el caché ya estaba activadoenablecache: 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 resultadocodificación del texto originalel punto de final para el rango de la elipsis es mayor que el de comienzoerror al cerrar la entrada `%s'error al cerrar el fichero de salidaerror al cerrar el fichero de datos de `profiling'error cuando se insertaba el elemento de unión en la tabla enlazadaerror al insertar en la tabla enlazadaerror al leer la entradase espera un argumento de cadena de caracteres para `copy'la línea de continuación esperada no se encuentrafallo al cargar el objeto compartido `%s'fallo al cargar los datos del símbolono se pudo hacer mmap con el fichero de datos de `profile'fallo al comenzar el proceso de conversiónerror al escribir los datos para la categoría `%s'fcntl: F_SETFDel campo `%s' en la categoría `%s' no está definidoel campo `%s' en la categoría `%s' no se ha definidoel fichero `%s' ya existe y podría ser sobreescrito +-el valor `from-value' del elemento de unión ha de ser una cadena de caracteresfstat ha falladoinconsistencia al final de la especificación del código de caracteresinconsistencias al final del númeroincongruencias 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 llamadasgenera 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ólicohay un enlace duro en alguna parteEl campo CORRECTION en la línea de año bisiesto es ilegalCampo Rolling/Stationary ilegal en la línea de año bisiestocarácter ilegal en la cadenacarácter no válido en el fichero: elemento de unión ilegaldefinición ilegalespecificada una codificación ilegalsecuencia de escape ilegal al final de la cadena de caracteressecuencia de entrada ilegal en la posición %ldnombres no permitidos para el rango de caracterestipodered ilegal :`%s' +-número de desplazamiento ilegal en la cadena %d en el campo `era' de la +-categoría `%s'número de conjunto ilegalfecha 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 caractereslímite de la implementación: no se permiten más de %d tablas de caracterescarácter o secuencia de desplazamiento incompleta al final del búferfichero formateado incorrectamentelínea de entrada de tipo desconocidoerror interno (descriptor ilegal)error interno - se llamó a `addtype' con un `isdst' erróneoerror interno - se llamó a `addtype' con un `ttisgmt' erróneoerror interno - se llamó a `addtype' con un `ttisstd' erróneoerror interno en %s, línea %udesplazamiento UTC inválidoformato de abreviación incorrectodía del mes inválidoaño de final inválidoaño bisiesto inválidomodo inválido para dlopen()nombre de mes incorrectola hora almacenada no es válidaaño de comienzo inválidohora del día inválidanombre del día de la semana incorrectola longitud de la clave en la petición es demasiado larga: %Zdla línea de después de la elipsis tiene que contener una definición de carácterla línea posterior a la elipsis no contiene una definición para una constante +-de caractereslínea demasiado largalista todos los juegos de caracteres conocidosfichero de locales `%s', que se usa en una orden `copy', no se encuentralstat ha falladouna línea incorrecta no se tendrá en cuentafalló la asignación de la tabla de cadenas de cabeceras de secciónfalló la asignación de las cabeceras de secciónmemoria alterada antes del bloque de memoria asignado +-memoria alterada pasado el final del bloque de memoria asignado +-memoria agotadamemoria 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 nombreno se ha especificado la codificación original ni la finalnetname2user: (búsqueda nis+): %s +-netname2user: la entrada DES para %s en el directorio %s no es únicanetname2user: la entrada LOCAL para %s en el directorio %s no es únicanetname2user: falta la lista de ids de grupo en `%s'.netname2user: el nombre principal `%s' es demasiado largonetname2user: no debería tener uid 0el programa %d no fue registrado nunca +-no se ha dado ningún valor o falta una expresión regular correcta para el campo `%s' en la categoría `%s': +-%sningún día del mes coincide con la reglano 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 sonameninguna otra palabra clave debe ser especificada al usar `copy'no se ha producido ningún fichero de salida debido a la existencia de avisosno se ha especificado ninguna asignación de repertorio: no se puede continuarno se ha especificado ningún nombre simbólicono se ha especificado ningún nombre simbólico para el final del rangono hay ningún peso definido para el símbolo `%s'no es un fichero regularconfiguració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 CHARMAPla codificación original no se ha especificado utilizando `-f'fichero de salidapmap_getmaps problema de rpcpoll: fallo de protocolo al configurar el circuito +-error del preprocesadormuestra la lista de contadores de ruta y su número de usomuestra información sobre el desarrolloproblemas 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 repetidoel 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 puertosmismo nombre de regla en varios ficherosse acabaron los datos mientras se leía la clave de petición: %slectura insuficiente mientras se leía la petición: %sescritura insuficiente en %s: %ssocket: fallo de protocolo al configurar el circuito +-los órdenes `forward' y `backward' son mutuamente excluyentesla especificación para el orden de peso del símbolo de unión no tiene sentidoentrada estándarsalida estándarla 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 finalel año de comienzo es demasiado alto para ser representadoel año de comienzo es demasiado bajo para ser representadola 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' tcpsvc_tcp: makefd_xprt: memoria agotada +-svc_unix.c - problema al crear el `socket' AF_UNIXsvc_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 elementoel símbolo para el elemento de unión multicarácter `%.*s' repite la definición +-de otro elementoel símbolo para el elemento de unión multicarácter `%.*s' repite la definición +-de otro símboloel símbolo para el elemento de unión multicarácter `%.*s' repite la definición +-de otro símboloel símbolo para el elemento de unión multicarácter `%.*s' repite otro nombre +-de símbolo en el conjunto de caractereserror de sintaxis en la definición de %s: %serror de sintaxis en la directiva `order_start'error de sintaxis en el nombre de clase de caráctererror de sintaxis en la definición de la conversión de caráctererror de sintaxis en la definición del orden de uniónerror de sintaxis en la definición de la uniónerror de sintaxis en una definición de categoría LC_CTYPEerror de sintaxis en la definición de una nueva clase de caráctererror de sintaxis en la definición de un nueva tabla de caractereserror de sintaxis en la definición de local para mensajeserror de sintaxis en la definición de local para monedaerror de sintaxis en la definición de local para númeroserror de sintaxis en la especificación de ordenerror de sintaxis en el prólogo: %serror de sintaxis en la definición de la asignación: %serror de sintaxis en la definición de local para la horaerror de sintaxis: no está dentro de una sección de definición para un localno se ha especificado la codificación final utilizando `-t'esta es la primera vez que aparece la definiciónhora antes de cerodesbordamiento horarioinsuficiente número de bytes en la codificación del carácterdemasiados bytes en la codificación del carácterdemasiadas clases de caracteres definidasdemasiados segundos intercalaresdemasiados tipos de hora local¡¿demasiadas transiciones?!¡demasiados pesos!demasiadas abreviaturas de zona horaria, o demasiado largashay inconsistencias al final de la líneadificultades para responder al programa %d +-no están permitidas dos líneas en una misma fila con `...'tecleado un único añono se puede asignar espacio para el búfer de entradano se pueden liberar los argumentossin definircarácter desconocido `%s'carácter no reconocido en el campo `%s' de la categoría `%s'la directiva de unión es desconocidadirectiva desconocida `%s': línea pasada por altoerror de iconv() desconocido %dconjunto `%s' desconocidosímbolo desconocido `%.*s': línea descartadazona sin reglasmensaje sin terminarcadena de caracteres sin terminarconstante de caracteres sin terminarnombre simbólico sin terminarnombre de peso sin terminarel límite superior del rango no es menor que el límite inferiormodo de empleo: %s fichero_de_entrada +-uso de 2/29 en un año no bisiestoel valor para %s tiene que ser un número enteroel valor para <%s> debe estar entre 1 y 4el valor para el campo `%s' en la categoría `%s' no debe estar vacíoel valor de tiene que ser mayor que el valor de el valor del campo `int_curr_symbol' en la categoría `LC_MONETARY' no se +-corresponde con un nombre válido en ISO 4217el valor del campo `int_curr_symbol' en la categoría `LC_MONETARY' tiene +-una longitud errónealos valores para el campo `%s' en la categoría `%s' deben ser menores +-que 127al aceptar la conexión: %sal 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 claveal abrir el fichero de catálogo antiguoal preparar la salidaal leer el fichero de datosal ejecutar `stat' sobre el fichero de datos de `profiling'al escribir la base de datosescritura incompletapuede ser modificado por otros además del propietarionúmero incorrecto de argumentosnú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ôKMLEUL&›L(ÂLëLüLM&M5MIMdM~Mn’MOO"%O"HOkO:‡OÂOËOÔOêOPP2PLPePPšP¶PÐPíPQ#Q*Q EQRQYQ3kQ3ŸQ4ÓQ.R%7R]R&qR%˜R¾R%ÕR3ûR,/S)\S†S"ŸS!ÂSäSûST.TDT"ZT*}T¨T&ÂT&éT&U&7U&^U…U U$¾UãUþUV,2V_V%}V,£V-ÐV þV&WFWeW„WžW²WÒW‰òW2|X¯X"ÊX4íX"Y#4Y XY=bY Y<±YîY'Z6Z)?Z(iZ ’Z³ZµZ½Z$ÎZóZ) +-[(4[][ m[y[#[/´[ä[ö[ \ \%\9\ N\Z\j\\ ›\¨\¾\ Õ\ á\ë\ï\ ]&]-<]!j]Œ]ª]È]ß]&ÿ]%&^0L^!}^Ÿ^-·^å^%_)(_'R_%z_& _Ç_ã_ ý_ +-`%`<`X`u`@Ž`DÏ`a'a@a Ua=_aaÇ·ab7žb2Öb- c7c$Jc +-oczc€c!„c¦c·cÐcícdd/dJd^drd3†d-ºd2ède,e5e;jzjƒj‡jšj!®j Ðj!Ýjÿj.kMk ak nk"{kžk±kÄk Úkäk+ük(lElVlmlŠl¤l¼lØlðl +-m1m$Mmrm„mŸm´mÏm çmômn +-n#n*n20ncnrn‹n šn¨nÄnÚnón oo!3oUosos“op*pCp]pnppžp±pÅpÝpópq qq9qVqnq„q,q +-ÊqÕq Üqéqr#r>rXrprr#¢rÆrÖrírs#&sJsjssss s²sÊsÝsæsöst1tPtptt™t¨tÂtÕtôtu*#uNuUumu‰u ™u!£u ÅuÏuéu v"v @vMvavrvƒv v(¾vçvww5wOwew~wŽw w´w½wÓwãw.ów"x 4x#Bx0fx%—x½xÑxçxøx y#y@yOymy„y›yºyØyÝyðyz+zEz_zqzƒzz·zÐzìz! {.{G{b{~{—{µ{"Î{ ñ{þ{ |$|8|J|`|-o|-|!Ë|í|}}2}C}2Z}#} ±}¾};Ò}~$~@~X~ r~ €~¡~¿~Ð~Ö~ð~/J&cŠŸ´½Ü ö€$0€ U€ c€o€…€š€²€º€Ë€߀ô€ *((S |‰"ƒÀD‚K‚$e‚ +-Š‚•‚«¤‚P„ `„n„!‚„¤„³„Ç„å„"ø„…*…@…S…'c…#‹…6¯… æ… +-ô…ÿ…"†"*†M†"g†Š†ª†ĆÛ† ñ†ÿ† ‡‡*‡C‡Z‡o‡‡–‡«‡½‡χ á‡î‡ ˆˆ#%ˆ:Iˆ„ˆšˆ%°ˆÖˆ"숉!‰ @‰"a‰ „‰¥‰¿‰ωá‰æ‰ë‰Š!ŠF>Š …Š.Š-¾Š6ìŠ8#‹;\‹I˜‹â‹ú‹Œ+$Œ+PŒ'|Œ¤Œ ÄŒ ьیùŒ&(.O&~¥,µâŽCŽ#aŽ…Ž¤Ž!ÀŽ"âŽ. 4%U;{&·Þ1þ0 KW"h‹'§Ïç.‘3‘"J‘(m‘-–‘Ä‘Ü‘!ù‘’8’X’t’!’²’Ê’æ’9ý’47“8l“+¥“8Ñ“$ +-”"/”!R”.t”£””á”<•;>•$z•Ÿ•·•*ו7–:–"Y–|–)–N¹–U—^—&|—)£— Í—Û—+ô— ˜>˜X˜j˜"Š˜%­˜*Ó˜*þ˜)™=™0W™ˆ™§™+Ç™7ó™#+šOš!mš$š!´šÖš&ñš%›,>›k›'z›%¢›0È›2ù› ,œ.9œhœKœLÍœLg+{2§2Ú/ ž$=žbž%xž-žž$Ìžñž Ÿ'Ÿ:Ÿ(QŸ&zŸ!¡ŸßFÚŸ! B4 Bw ?º <ú 77¡o¡Š¡#¥¡.É¡0ø¡0)¢Z¢x¢‹¢§¢¼¢Тå¢ÿ¢£%£;£O£#d£5ˆ£G¾£ ¤#¤58¤ n¤{¤-’¤!À¤(â¤- ¥9¥J¥'\¥?„¥=Ä¥ ¦.¦ ?¦9`¦;š¦,Ö¦*§#.§R§%l§A’§Ô§ñ§I¨7X¨3¨+Ĩð¨'©!/©Q©.b©‘©C¤©*è© ªª(8ªaª1tª¦ªÁª:ݪ«)6«*`«#‹«¯«$Ï«ô«¬",¬O¬m¬‡¬¤¬>Ĭ­!"­ D­(e­$Ž­³­*É­=ô­H2®{®Š®Eš®&à®(¯'0¯EX¯ž¯(·¯'à¯$°,-°)Z°%„°ª°"È°ë°& ±0±PO±V ±U÷±OM²V²!ô²'³*>³/i³*™³$ij/é³1´/K´){´*¥´)д#ú´µ-9µ&gµ4Žµ(õìµ ¶ ¶#(¶$L¶"q¶”¶ª¶ĶÛ¶.춷;·3X·Œ·#ž·· Û·å·0ü·-¸$I¸n¸‡¸#˜¸ ¼¸ȸݸñ¸¹)¹4B¹w¹Š¹§¹'ǹBï¹D2ºjwºKâº?.»n»»!ª»Ì»æ»¼¼"3¼V¼r¼ƒ¼¡¼#»¼#ß¼#½0'½#X½|½š½*¸½%ã½; ¾E¿Y¿Tl¿YÁ¿>À@ZÀ›À¯ÀÌÀÞÀïÀÁ Á:ÁÔOÁ$Ã:Ã(LÃ(uÞÃCºÃþÃÄÄ/ÄHÄeÄ~Ä›Ä ¸ÄÙÄ öÄÅ3ÅSÅ)kŕŜŠ¸Å +-ÅÅÐÅ>ãÅ>"ÆMaÆ4¯Æ%äÆ +-Ç+*Ç%VÇ|ÇA”Ç8ÖÇ8È8HÈÈ'›È/ÃÈóÈÉ**ÉUÉrÉ,ÉM¼É +-Ê(#Ê(LÊ(uÊ(žÊ(ÇÊðÊ+Ë14Ë&fË˨Ë0ÃËôË(Ì/<Ì0lÌ!Ì)¿ÌéÌ2Í9ÍWÍnÍŽÍ‘®Í<@Î$}Î(¢Î9ËÎÏ)Ï @ÏDJÏÏT¡Ï)öÏ* Ð KÐ7YÐ7‘Ð0ÉÐúÐüÐÑ0ÑFÑ6\Ñ1“ÑÅÑÖÑéÑ) ÒE3ÒyÒ“Ò ­Ò»ÒÌÒ#ëÒÓ Ó,5Ó3bÓ–Ó¦Ó+ÂÓîÓ ÔÔÔ ,Ô0:Ô>kÔ2ªÔÝÔüÔÕ$9Õ6^Õ3•Õ=ÉÕDÖLÖDkÖ+°Ö5ÜÖ.×<A×4~×:³×%î×Ø 2ØSØqØ/ˆØ ¸Ø!ÙØ]ûØiYÙÃÙ-ÕÙ4Ú 8Ú>BÚ'Úé©Ú“ÛL±ÛCþÛCB܆Ü5œÜ ÒÜÞÜäÜ.èÜÝ7ÝTÝ+sÝŸÝ ºÝÛÝöÝ +-Þ$(ÞVMÞF¤ÞPëÞ<ß +-[ßfßnß3‚߶ßUÖß0,à4]àA’àÔàëà=áPFá—á3´áèá,ûá(â0Aârâ„â¢â9¾âøâã)ã¿Aãä'ä*Bämä‡ä—ä¬ä)Ãä-íäå,;å4hå,å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‡ó+¸óäó&ô!)ô1Kô}ô"˜ô2»ôîô öô#õ;õ +-Sõ+^õŠõ¤õ¾õ+Öõ4ö 7öCöWögö„ö&£ö/Êöúö÷(÷@÷ ^÷1÷±÷Å÷Ú÷î÷õ÷ø4ø/Cøsø‹ø( øGÉø6ùHù cù„ù”ù<¬ù%éùú##úGú`ú(wú& úÇúÏú#éú û.û Kû%lû’û§ûÄû ãû#ü!(ü"Jü!mü&ü&¶ü&Ýü/ý$4ý.Yý ˆý(”ý'½ý*åýþ"þ9þCHþ;Œþ(Èþ3ñþ%ÿ =ÿ'^ÿ)†ÿQ°ÿ,/!>Q`(²,Û&%L'],…²ÃÉã!ú7#W/{«ËÞ/ç13e=ƒÁÒå #;BQo Ž%¯Õ7Ü;P_(t›9@*Z…Žî£’«Æ$× ü +- (# L %^ „ %“  ¹ Ú &î + +->A +-€ +- +- +-› +-'£ +-(Ë +- ô +-. D d ƒ  ½ Í  Þ  ë ù  1 K ] u  ® Í ì   6 += =i § Å 1ã $;:v6Œ/Ã-ó,!&Nu…œ¡¦%½-ãn €54ÃAøH:@ƒTÄ1J3\3-Ä!ò&.;,j—;®;êC&j8€)¹ãT-W:…(À$é':6'q)™PÃ0;EF2Èû +-5'T0|#­(Ñ:ú51T>†8Åþ>4.s*¢(Í.ö4%"Z%}£JÁ@ GM6•BÌ&%65\5’ È é! +-F,Fs*º"å#4,Aa£2Áô2 hA lª "!4:!.o!ž! ¯!5Ð!("/"N" h"‰"&©"1Ð"3#6#L#>g#4¦#0Û#> $OK$3›$%Ï$+õ$+!%+M%)y%A£%-å%6&J&-Y&%‡&1­&@ß& '4;'p'aŒ'Sî'SB(–(N±(?)D@),…)?²)ò)9*>B*-*!¯*Ñ*ñ*+5+1S+,…+²+YË+%,G;,Gƒ,IË,H-@^-Ÿ-¾-$Ý-G.IJ.I”. Þ.ÿ./O>J_>-ª>1Ø>1 +-?JBz¸Bw3C‡«C.3D1bD?”D?ÔD?E4TEG‰EHÑEGF9bFEœFJâF;-G!iGD‹GLÐGJH.hH —H¸HÓH0ïH, I,MIzI7”IÌIëI8J%:J%`J>†JÅJ+ÝJ# K-K6K6MK"„K&§KÎKìK%ýK#L3LEL!WLyL’LT©LþL.M$IM2nMJ¡MNìM~;NZºNMO&cO+ŠO7¶O'îO1P#HP(lPB•P0ØP Q7QUQ4rQ4§Q4ÜQDR4VR‹R«RHËR0SÙkÝß@,Œ(Èø:CØ÷p}Õë2ÑëkD†!aSqäJw7ºý@„EVH¿sèlsŠu[¢vË©á: ã6=u‚ño.£ |dãpÔ9™$–[¥l?úC`ŒŒ‡*€X9IÊSVp!Ò…ydá‡þ£בQò1õÂn^ +- m4·¨?îm³rŠþ]„ý‚Ì#´/_JÄœsfQ8årÍz•ƒ<ÖxB{Kˆå>÷DM¢œùÓ>·ÇoiÃ@xµûb ¶ga„Eoe-xWØ؃ZsR"ˆ4/îÁ*Û(äÇ…1 kLVÌN)²‰Ay¹*íf$XQ)#K¤ûÕ[qDáè½TaÄ.ÜùT,'ûu\àê!3ë‹g +-=H]Ó-5Oz»ßj«¬Ú ƒõôïí¿®Á”.¯ø†G’jJZ„R™›C¯3ÿÆ%e`«Ô¡ÉUm{QcP˜«¾òÀƺ6rÍ`ÿ³tôe5‹Fh|›§ìbܱ²ÈeÙ\~2E j¼#š þmÅy ¶1Mö\»4fR ¨×7YŠfL˜FΠª ‰<È¥  Ú’³{iYÏãç÷ %ÿ§(cŽÒ~,Ÿ{é‚ ñC5"Ñ?Ðv)…? +-+/~_"}W|ÛÉdµ¡O"=™R¤Lݽ@uÄ7^ý®8P‡Ãªy` <w}_¨'HdÑnš®ïH”GŽ5>+SÕ-Ý­Yú!©¾Iõgl¼^zßÒvžÞ¹öͤNA|ôtWÏ·+ðƒ$3h̪cèŒb&A´ib[ ¦8Û“ÞOàÔo×Y#róN0——í;n°Ü%‚ñó¼Ëžð E K +-M꿬âh¬XTt ¾^ü9‹M J”âµ>+Š(ì2c±‘6&£œV)†ü›¡¦úU=B•“º;véÊì0Ë€ZüÊï%ɯâ½~]ಘð1¶Np2i':0-DÅ°¸S­ÚÖWL8Óꦟî}¹ç,ø°¸Ðtäö&‘Bw†ælÏIæó‹å6'“ÎçUÙ‰À:*øF‰»– n.…q7éx/Þw;ŸÇž’À&§´G;TZF©g4ˆqò_OKP\–Æ—X•IzÅÂÁ‡G0aAˆBæjUù­€€š<$Ðk¥¢ÎÖ]PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: French +-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: %sLa 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: doit être plus grande que +-%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 ne doit pas être dans la classe `%s'.Le caractère n'est pas dans la classe `%s'.?AbandonDroits d'accès :Accès d'une librairie partagée qui est corrompueAdresse déjà utiliséeFamille d'adresses non supportée pour le nom de l'hôteFamille d'adresses non supportée par le protocoleErreur d'annonceMinuterie d'alerteListe de paramètres trop longueTentative de retrait d'une table non videTentative d'édition de liens à partir de trop de librairies partagéesSuccès d'authentificationErreur d'authentificationOBJET ERRONÉ +-Mauvaise adresseMauvais descripteur de fichierMauvais format du fichier de fontesMessage invalideAppel système erronéMauvaise valeur pour l'indicateur `ai_flags'Doit se conformer de façon stricte à la norme POSIXValeur binaire +-Bloc de périphérique requisProblème de scrutation lors de la diffusionRelais brisé (pipe)Erreur du busCDSTemps UCT limite expiréCache expiréeNe peut accéder à la librairie partagée demandéeNe peut établir un lien avec le serveur qui dessert ce domaineNe peut communiquer avec le convertisseur de portsNe peut communiquer par ypbindNe peut communiquer par ypservNe peut allouer de la mémoireNe peut attribuer l'adresse demandéeNe peut créer un socket pour une diffusion de type RPCNe peut exécuter une librairie partagée directementNe 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 diffusionNe peut enregistrer le serviceNe peut transmettre suite à la fermeture du noeud final de transportNe peut transmettre le paquet par diffusionNe peut initialiser l'option `SO_BROADCAST' du socketNe 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 limitesCaractère de séparation : %c +-Le processus `enfant' a terminé.Identité du client peu fiableColonnes : +-Erreur de communication lors de la transmissionCompiler la spécification localeL'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éeConnexion ré-initialisée par le correspondantConnexion terminée par expiration du délai d'attentePoursuiteConversion de l'encodage des fichiers d'un encodage à l'autre.Conversion des caractères en minusculesCopyright © %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 symbolesCréer la sortie même si des messages d'avertissement sont affichéesCréer une base de données DB simple à partir des entrées textuellesDate de création : %sEntrée DES pour le nom de réseau %s n'est pas unique +-RÉPERTOIRE +-DNANSDNSLa base de données de la table est inexistanteLa base de données est occupée.Droits d'accès par défaut : +-Adresse de destination requiseLe 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 disqueNe pas cloner le processus par fork() et ne pas afficher de message sur le tty courantNe pas afficher de message lors de la génération de la base de donnéesNe pas utiliser le catalogue existant, forcer la génération d'un nouveau fichierLe domaine n'est pas délimité.Trappe EMTENTRÉE +-Données encryptées +-Mauvais appariement de type des entrées de la tableErreur dans le sous-système RPCErreur 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 usagersL'é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 fichierNom de fichier trop longDébordement de la taille permise pour un fichierFichier trop grosChaîne Premier/Suivant briséeException en point flottantResynchronisation complète est requise pour ce répertoireFonction non implantéeGROUPE +-Rebut dans le paramètre ARGP_HELP_FMT: %sGé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ériqueTrouver l'information locale spécifiqueDonner un court message expliquant l'usageDonner cette liste d'aideErreur gratuiteGroupe : %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 cibleE/S possibleFICHIER_D_ENTRÉE FICHIER_DE_SORTIE +--o FICHIER_DE_SORTIE FICHIER_D_ENTRÉE +--u FICHIER_D_ENTRÉETrappe IOTIVYIdentificateur éliminéInstruction illégaleObjet illégal pour ce type d'opérationRepérage illégalType de fichier ou format inappropriéIoctl() inappropré pour un périphériqueOpération inappropriée pour un processus d'arrière-planRequête d'informationInformation:Fichiers d'entrée:Spécification des formats d'entrée/sortie:Erreur d'entrée/sortieErreur interne de NISErreur interne de ypbindInterruptionAppel système interrompuAppel système interrompu, il aurait dû être relancéObjet invalide pour l'opérationParamètre invalideRéférence arrière invalideNom de classe de caractères invalideIdentité du client invalideVérificateur du client invalideCaractère de fusionnement invalideContenu invalide de \{\}Lien croisé de périphéque invalideÉchange invalideChaîne multi-octets ou étendue de caractères invalide ou incomplèteExpression régulière précédente invalideFin d'intervalle invalideExpression régulière invalideCode de requête invalideDescripteur de requête invalideVérificateur du serveur invalideDalot invalideest un répertoireest 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 halteNiveau 2 non synchroniséNiveau 3 en halteNiveau 3 réinitialiséLien pointe sur un nom illégalLe lien a été endommagé.Numéro du lien hors intervalleType d'objet lié : Liés à : %s +-Le nom du domaine local n'est pas initialisé.Échec d'allocation de ressources localesLa machine cible n'est pas sur le réseau.Nom mal composé ou nom illégalLes 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émoireMémoire épuiséeMessage trop longAttribut manquant ou mal composéDate de modification: %sÉchec de modificationÉchec de l'opération de modificationFormat de sortie de modification:Tentative de connexion par des noeuds multiples de relaisNOMNOM +-[-a|-m]NISNon concordance de la version client/serveur NIS - ne peut fournir le serviceLa 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ÉRONom : '%s' +-`Daemon' de la cache du service de nomsNom pas desservi par ce serveurLe nom n'est pas unique sur le réseau.Nom ou service inconnuNom entrée n'est pas uniqueObjet nommé n'est pas repérableBesoin d'un authentificateurLe 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 disponibleAucun sémaphore XENIX disponibleAucune adresse associée avec le nom de l'hôteAucune adresse associée avec le nomAucune `anode' disponibleAucun espace tampon disponibleAucun processus enfantAucune donnée disponibleAucun espace disque disponible sur le serveurAucun verrou disponiblePas de concordanceAucun medium trouvéAucun message du type désiréAucun autre enregistrement dans la table de la base de donnéesAucune expression régulière précédenteAucun programme enregistré sur l'hôte cible +-Aucun chemin d'accès pour atteindre l'hôte cibleAucun espace disponible sur le périphériqueAucun périphérique de ce typeAucun fichier ou répertoire de ce typeCette clé n'est pas dans la tableCette table n'est pas dans le domaine du serveur.Aucun processus de ce typeEspace des noms non-NIS+ rencontréÉchec non récupérable lors de la résolution du nomAucun. +-Pas repéré, aucun nom de ce typeAucun fichier de type `XENIX named'N'est pas un répertoirePas repéréN'est pas un serveur maître pour ce domaineN'est pas le propriétaireNombre 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 existeNombre impair de caractères apostropheSeul ROOT est autorisé à utiliser cette option!Opération déjà en coursOpération non permiseOpération non supportéeOpération maintenant en coursL'opération pourrait se bloquer.Aucune autre ressource de type streams disponibleContrôle de sortie:Sélection de sortie:Propriétaire : %s +-PRIVÉ +-Le package n'est pas installé.Erreur d'analyse syntaxique: %sSuccès partielL'objet fourni n'est pas le même sur le serveurPermission non accordéePanne d'alimentationFin prématurée de l'expression régulièreAfficher le contenu du fichier de base de données, une entrée par ligneAfficher les statistiques de la configuration couranteAfficher d'autres messagesAfficher la version du programmeSuccès probableProbablement pas repéréExpiration de la minuterie durant l'établissement du profilePilote du protocole n'est pas attachéErreur de protocoleFamille de protocoles non supportéeProtocole non disponibleProtocole non supportéMauvais type pour un socket de protocoleRequête illégale pour la table `named'QuitterErreur spécifique à `RFS'Mauvaise procédure RPC du programmeÉchec RPC durant l'opération NISProgramme RPC non disponibleVersion de programme RPC erronéeLa déclaration struct RPC est erronéeMauvaise version RPCRPC: (code d'erreur inconnu)RPC: erreur d'authentificationRPC: ne peut décoder le résultatRPC: ne peut encoder les paramètresRPC: échec (erreur non spécifiée)RPC: versions incompatibles de RPCRPC: échec de conversion de portsRPC: la procédure n'est pas disponibleRPC: le programme n'est pas enregistréRPC: le programme n'est pas disponibleRPC: non concordance de programme ou de versionRPC: erreur système sur l'hôte cibleRPC: le serveur ne peut décoder les paramètresRPC: succèsRPC: expiration du délai de la minuterieRPC: incapable d'effectuer la réceptionRPC: incapable d'effectuer la transmissionRPC: hôte inconnuRPC: protocole inconnuRSA (%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 profilageLire les données de configuration du NOMSystème de fichiers accessible en lecture seulementSignal de Temps-Réel %dExpression régulière trop grosseErreur d'entrée/sortie sur l'hôte cibleL'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: +-. +-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 ressourcesRessource perdueRessource temporairement non disponibleRésultats transmis à la procédure callback()SHOBJ [PROFDATA]SUNYPChemin de recherche : %s +-Erreur de segmentationServeur occupé, essayer plus tardMémoire du serveur épuiséeLe serveur a rejeté l'identité.Le server a rejeté la vérification.Servname() n'est pas supportée pour ai_socktypeInitialiser le nom du programmeArrêter le serveurSignal 0Opération de type socket sur un type non socketType 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 pilePanne d'accès au fichier NFSDémarrage du NOMBRE de `threads'Statut : %s +-ArrêtéSignal d'arrêtArrêté (via l'entrée sur tty)Arrêté (via la sortie sur tty)Erreur de relais de type streamsLa structure a besoin d'un nettoyage.SuccèsSupprimer les messages d'avertissement et d'informationLes noms symboliques des caractères définis dans le FICHIERErreur systèmeInformation système:Échec d'allocation de ressources systèmeRépertoire système de la table des caractères : %s +- de la table des répertoires: %s +- du chemin des localisations: %s +-%sTABLE +-Type de table : %s +-Échec temporaire dans la résolution du nomComplé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 minuterieTrop d'attributsTrop de niveaux de liens symboliquesTrop de liensTrop de fichiers ouvertsTrop de fichiers ouverts dans le systèmeTrop de processusTrop de références: ne peut segmenterTrop d'usagersTrappe pour point d'arrêt et de traceBarre oblique inverse en suffixePanne du traducteurNoeud 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 +-INCONNUIncapable 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 serveurInconnu (type = %d, bits = %d) +-Mot clé inconnu %s dans .netrcCode d'erreur NIS inconnuBase de données inconnue: `%s' +-Erreur inconnueErreur inconnue Hôte inconnuObjet inconnuOption inconnue: %s %s %sErreur inconnue du `resolver'Erreur du serveur inconnuSignal inconnu %dErreur système inconnueErreur 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 urgenteUsage: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'usagerSignal #2 défini par l'usagerValeur trop grande pour le type défini de donnéesExpiration de la minuterie virtuelleRésultat anarchique résultant de l'exécution de la commandeLa 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 mediumX500XCHSYPBINDPROC_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éeai_socktype non supportédéjà en exécutionLe 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 ordreauthunix_create: mémoire épuisée +-Mauvais paramètreMauvais propriétaireChamp `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 tamponcache_set: ne peut allouer une nouveau tampon rpc_buffercache_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 dateNe 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 symbolesNe peut créer un descripteur interneNe peut créer les descripteurs internesNe peut activer le socket pour accepter des connexions: %sNe 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 %dNe peut insérer l'élément de fusionnement `%.*s'Ne peut effectuer une insertion dans la table des résultatsNe peut insérer une nouvelle définition de symbole de fusionnement: %sNe peut charger le fichier de données de profilageNe peut ouvrirNe peut ouvrir `%s'Ne peut ouvrir le fichier de base de données `%s': %sNe peut ouvrir le fichier d'entrée `%s'Ne peut ouvrir le fichier des localisations `%s'Ne peut ouvrir le fichier de sortieNe 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'ordonnancementNe peut lire via le répertoire de la table des caractères `%s'Ne peut lire le fichier de configuration; cela est fatalNe peut lire du clientNe 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 statistiquesNe peut évaluer par stat() le fichier `%s': %sNe 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 clientCatégorie de données requises plus d'une fois: n'aurait pas dû se produireCaractè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 non défini dans la table des caractèresCaractère `%s' non défini alors qu'attendu comme valeur par défautClasse de caractères `%s' déjà définieTable de caractères `%s' déjà définieFichier de la table des caractères `%s' non repérableclnt_raw.c - Erreur fatale de sérialisation d'en-têteclnttcp_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éeSymbole de fusionnement `%.*s' apparaît plus d'une fois: ligne ignoréeSymbole de fusionnement attendu après `%s'Connexion établie à l'adresse %s: Constante ou identificateur attenduLa conversion de `%s' vers `%s' n'est pas supportée.Conversion arrêtée en raison d'un problème d'écriture à la sortieNe 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 fusionnementDuplicité de la définition du caractère `%.*s'Duplicité de cléDuplicité de jeux de définitionsDuplicité du nom de zone %s (fichier "%s", ligne %d)Duplicité de l'identificateur de messageDuplicité du numéro de messageChaîne vide de caractèresNom du poids vide: ligne ignoréeenablecache: cache déjà activéeenablecache: ne peut allouer une cacheenablecache: ne peut allouer une cache de donnéesenablecache: ne peut allouer une cache de type fifoencodage de la sortieencodage du texte originalNoeud final de l'intervalle d'ellipse plus grand que l'initialErreur lors de la fermeture du fichier d'entrée `%s'Erreur lors de la fermeture du fichier de sortieErreur lors de la fermeture du fichier de données de profilageErreur durant l'insertion d'un élément de fusionnement dans la table de hachageErreur lors de l'insertion dans la table de hachageErreur lors de la lecture de l'entréeChaî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_SETFDChamp `%s' de catégorie `%s' n'est pas définiChamp `%s' de catégorie `%s' indéfiniLe 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écificationRebut à la fin des chiffresRebut à 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 grapheGénérer un ficher de profilage plat avec les décomptes et les marques de tempsget_myaddress: ioctl (a obtenu la configuration de l'interface)getent() - obtenir les entrées de la base de données administrativeshandle_request: requête reçue (Version = %d)Échec de création du lien direct, création d'un lien symboliquelien 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îneCaractère illégal dans le fichierÉlément de fusionnement illégalDéfinition illégaleEncodage fourni illégalSéquence d'échappement illégale à la fin de la chaîneSéquence d'échappement illégale à la position %ldNom 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égalDate 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 permisesLimite d'implantation: pas plus de %d tables de caractères sont permisesCaractère ou séquence de changement incomplet à la fin du tamponFichier incorrectement formatéLigne d'entrée de type inconnuErreur 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 %uAdressage relatif GMT invalideFormat d'abréviation invalideJour du mois invalideAnnée finale invalideAnnée bissextile invalidemode invalide pour dlopen()Nom de mois invalideTemps sauvegardé invalideAnnée initiale invalideHeure du jour invalideNom du jour de semaine invalideLa longueur de la clé dans la requête est trop longue: %ZdLa 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 longueListe tous les jeux de code de caractèresFichier 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êteMémoire écrasée avant le bloc alloué +-Mémoire écrasée après la fin du bloc alloué +-Mémoire épuiséeMé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 nomNi 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 uniquenetname2user(): entrée LOCAL de %s dans le répertoire %s n'est pas uniquenetname2user(): identificateur de liste de groupes manquant dans '%s'netname2user: nom principal '%s' est trop longnetname2user: ne devrait pas avoir le UID 0Le programme %d n'a jamais été enregistré. +-Aucune valeur ou fournieExpression régulière incorrecte du champ `%s' de catégorie `%s': %sPas de jour dans les règles de concordancePas 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à émisAucune table de répertoire spécifiée: ne peut procéderAucun nom symbolique fourniPas de nom symbolique fourni pour la fin de l'intervallePas de poids défini pour le symbole `%s'N'est pas un fichier régulierConfiguration 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 sortieproblème RPC avec pmap_getmaps()poll: échec du protocole dans la configuration du circuit +-Erreur du préprocesseurAfficher le décompte des chemins et le nombre de leur utilisationAfficher des informations de progressionProblè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 foisFichier de la table des caractères `%s' non repérablerpcgen: 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 portsMême nom de règle dans plusieurs fichiersLecture écourtée lors de la lecture de la clé de requête: %sLecture écourtée lors de la lecture de la requête: `%s'Écriture écourtée dans %s: %ssocket: é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 standardsortie standardDate initiale illégale dans la chaîne %d du champ `era' +-de catégorie `%s'.Année initiale plus grande que l'année finaleAnnée de départ trop grande pour être représentéeAnnée de départ trop petite pour être représentéeDate finale illégale dans la chaîne %d du champ `era'\n" +-de catégorie `%s'svc_run: - échec de sélectionsvc_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 TCPsvc_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 socketsvcunix_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: %sErreur de syntaxe dans la directive `order_start'Erreur de syntaxe dans la définition de la classe de caractèresErreur de syntaxe dans la définition du caractère de conversionErreur de syntaxe dans l'ordre de la définition du fusionnementErreur de syntaxe dans la définition du fusionnementErreur 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èresErreur de syntaxe dans la définition d'une nouvelle table de caractèresErreur de syntaxe dans la définition localisée du messageErreur de syntaxe dans la définition localisée des valeurs monétairesErreur de syntaxe dans la définition localisée de représentation numériqueErreur de syntaxe dans la spéficication de l'ordonnancementErreur de syntaxe du prologue: %sErreur de syntaxe dans le répertoire de la table des définitions: %sErreur de syntaxe dans la définition localisée de la représentation du tempsErreur de syntaxe: pas à l'intérieur d'une section de définition localiséeencodage cible non spécifiée par l'option `-t'Ceci est la première définition.Temps défini avant le zéroDébordement du temps allouéTrop peu d'octets pour l'encodage des caractèresTrop d'octets pour l'encodage des caractèresTrop de définitions de classes de caractèresTrop de délai en secondesTrop de types localisés pour la représentation du tempsTrop de transitions définies?!Trop de poids définisTrop ou de trop longues abréviations de fuseaux horairesSuffixe en rebut à la fin de la ligneProblème à répondre au programme %d. +-Deux lignes consécutives contenant `...' ne sont pas permises.Une seule année fournieincapable d'allouer un tampon pour l'entréeincapable de libérer des paramètresindéfiniCaractère inconnu `%s'Caractère inconnu dans le champ `%s' de catégorie `%s'Directive de fusionnement inconnueDirective inconnue `%s': ligne ignoréeerreur inconnue de iconv() %dJeu inconnu `%s'Symbole inconnu `%.*s': ligne ignoréeZone sans règleMessage incompletChaîne incomplèteChaîne d'une constante incomplèteNom symbolique incompletNom de poids incompletLa 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 doit être plus grande que la valeur de +-.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: %slors de l'allocation d'entrée dans la cachelors de l'allocation d'entrées dans la table de hachagelors de l'allocation d'une copie de clélors de l'ouverture du vieux fichier du cataloguelors de la préparation de la sortielors de la lecture de la base de donnéeslors de l'évaluation par `stat' du fichier de données de profilagelors de l'écriture du fichier de base de donnéesécriture incomplèteaccessible en écriture par d'autres que le propriétaireMauvais nombre de paramètresMauvais 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 @@ +-Þ•Úì'¼=XRYRlRMREÍR&S(:ScStSŒSžS­SÁSÜSöSn +-TyU‹U"U"ÀUãU:ÿU:VCVLVbVyV“VªVÄVÝVùVW.WHWeW}W›W¢W ½WÊWÑW3ãW3X4KX.€X%¯XÕX&éX%Y6Y%MY3sY,§Y)ÔYþY"Z!:Z\ZsZŒZ¦ZÀZÖZéZ*ÿZ*[&D[&k[&’[&¹[&à[\ \$@\e\€\š\,´\á\%ÿ\,%]-R] €]&¡]È]ç]^ ^;^[^‰{^2_8_"X_4{_°_#Â_ æ_=ð_.`<?`|`'œ`Ä`)Í`(÷` aAaCaKa$\aa)˜a(Âa/ëab +b7bLb^bub#Œb=°b/îbc0c Ec Sc_cwc‹c›c °c¼cÍcäcôc d %d2dHd _d kdudyd ‘d&Ÿd&Æd-íd!e=e[eyee&°e%×e0ýe!.fPf!hf-Šf¸f%Õf)ûf'%g%Mg&sgšg¶g ÐgÝgøgh+hHh@ahD¢hçhúhi (i=2ipiÇŠiRj7qj2©j-Üj +-kk$/k +-Tk_kek!ik‹k#œkÀkÙk ökll,lDl_lsl‡l›l3¯l-ãl2mDmUm^memumm —m ¡m «m µm ¿m Ém Óm Ým çm ñm ûm n n n #n -n 7n An Kn Un _n insn|n…nŽn—n n©n²n»n<Òno$/o)To ~oŒo1žoÐo8Õop)p FpRphp„p—p°pÄpÓpëp"q'q@qGqŽdqóq r)rDrXrir }r‹r$«rÐr"×r%úr" s"Cs%fs Œs™s ²s ¼s>Ésttt(t>t!Rt tt!t£t.Âtñt u u"uBuUuhu ~uˆu+ uÌuÝuôuv+vCv_vwv‘v¢v1¿v$ñvw(wCwXwsw ‹w˜w·wÆwÕw +-êwõwüw2x5xDx]x lxzxx©xÅxÛxëx!y'yEyseyÙy*êyz/z@zTzez„z—z«zÃzÙzìz ñzþz9{<{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Œ…Œ™Œ®ŒÁŒÚŒ*âŒ( 6C"WƒzþŽ ŽŽ$/Ž +-TŽ_Ž«nŽ *8!Ln}‘¯"Âåô +-‘‘'-‘#U‘6y‘ °‘ +-¾‘É‘"Ñ‘"ô‘’"1’T’t’Ž’¥’ »’É’ Ø’å’ô’ “$“9“K“`“u“‡“™“ «“¸“Ó“è“#ï“:” N”o”…”%›”Á”"×”ú”! • +•"L• o••ª•º•Ì•Ñ•Ö•í• –F)– p–4z–.¯–-Þ–6 —8C—;|—I¸—˜˜4˜+D˜+p˜'œ˜Ę ä˜ ñ˜û˜™5™&H™.o™&ž™Å™,Õ™š!šC=š#š¥šÄš!àš"›.%› T›%u›;››&×›þ›1œPœ kœwœ"ˆœ«œ'Çœïœ.$S"j(-¶äü!ž;žXžxž”ž!°žÒžêžŸ9Ÿ2WŸ6ŠŸ+ÁŸ?íŸC- 8q $ª "Ï !ò .¡C¡b¡¡<¡¡;Þ¡$¢?¢W¢*w¢7¢¢Ú¢"ù¢£)/£NY£U¨£þ£&¤)C¤ m¤{¤+”¤À¤Þ¤ø¤ +-¥"*¥%M¥*s¥*ž¥É¥Ý¥0÷¥(¦E¦d¦+„¦7°¦#è¦ §!*§$L§!q§“§&®§%Õ§,û§(¨%7¨0]¨2Ž¨ Á¨.Ψý¨K©Lb©L¯©ü©+ª2<ª2oª/¢ª$Òª÷ª% «-3«$a«†«¢«¼«Ï«(æ«&¬!6¬X¬Fo¬¶¬BɬB ­?O­<­7Ì­®®#:®.^®0®0¾®ï® ¯ ¯<¯Q¯e¯z¯”¯§¯º¯Яä¯#ù¯5°GS° ›°#©°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#¾Oy¾Vɾ! ¿'B¿*j¿/•¿*Å¿$ð¿/À1EÀ/wÀ)§À*ÑÀ)üÀ#&ÁJÁ-eÁ&“Á4ºÁ(ïÁÂ5 FÂ#TÂ$xÂ"ÂÀÂÖÂðÂÃ.ÃGÃgÃ3„øÃ#ÊÃîà ÄÄ0(ÄYÄ$uĚijÄ#ÄÄ èÄôÄ ÅÅ:ÅUÅ4nţŵÅÒÅ'òÅBÆD]Æj¢ÆK Ç?YÇ ™Ç£ÇÂÇ!ßÇÈÈ:ÈQÈ"hȋȧȸÈÖÈ#ðÈ#É#8É0\É#ɱÉÏÉ*íÉ%Ê:>ÊyË‘ËQ©ËDûË&@Ì(gÌ̦ÌÄÌÖÌèÌüÌÍ2ͱFÍøÎ Ï"Ï"BÏeÏ?…ÏÅÏÎÏ×ÏôÏ Ð*ÐCÐ`Ð#€Ð¤Ð#ÄÐèÐ#Ñ,ÑEÑcÑjÑ „Ñ‘Ñ™Ñ8«Ñ8äÑLÒ1jÒ)œÒÆÒ2ßÒ$Ó7Ó1QÓ3ƒÓ6·Ó,îÓÔ*9Ô&dÔ‹Ô©Ô)ÈÔòÔ Õ!Õ7ÕCPÕ”Õ#®Õ#ÒÕ#öÕ#Ö#>Ö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ãAHã+Šã3¶ã3êã7ä0Vä9‡ä!Áäãäå)å@åWå$wåœåP¸åT æ^æ&qæ˜æ «æ8¸æñæÍç.ÞçJ è8Xè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ò(ò*¹òäò"ýò ó ,óV8ó óó¡ó ·óØó*òóô'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Ÿ&³,Ú'8Th‚ ¯ ÆÒ)ð .<UYm"Ç ê 1D"Wz’%±×ë43hƒ#œÀà&8AW k2y¬½$ÎHó0<m †§¶Ð'î#(Le*}$¨ÍÖ$í 0 "L o  !§ É )æ ( +-"9 +-"\ +- +- ˜ +-¹ +-Ö +-(ó +- 38  +-l w ‹ ¤ ¼ Ö ñ 3 94 %n "” · "Î ñ  ? ,^  ‹ — ?° "ð -M h‰$™¾*Ù1!Ce z!›'½å"@]|(“¼ Ì#Úþ &5Rm"‹®+´0à!%9ž_þ %( NX«q.='Rz'ªÒ(æ%#Ig)‚*¬A× +-) 4'@(h‘(®#×û9Xi{¤Áàý.I]q…”±ÊÏ8í*&Qo2À)×5+G.s*¢!Íï"9X\w Ô;Þ-<HB…8ÈDTF›³Í+Ý+ *5"`ƒ˜¯Ïí* 84 6m ¤ 3¼ 7ð  (!HI!/’!.Â!+ñ!'"(E"3n"*¢",Í"Gú"4B#+w#C£#%ç# $$76$,n$:›$%Ö$*ü$@'%h%-ˆ%9¶%9ð%*&#E&,i&*–&)Á&&ë&2'2E'$x')'Ç'>ç'6&(:](0˜(DÉ(H)GW)$Ÿ)#Ä)/è)7*!P*!r*"”*E·*Eý*3C+w+-“+'Á+:é+#$,)H,r,;Œ,TÈ,Z-x-.˜-'Ç-ï- ÿ-2 .#S.w.“.#¯.Ó.7ò.A*/?l/¬/Â/?á/-!0O0"m0,07½0õ01*+14V1-‹1+¹1;å11!23S2‡2)–22À2=ó2134J33N”3Gã3E+4q4)‹48µ4;î40*5;[5—5$·5,Ü5' 616O6m66)˜6+Â6(î67O27‚7Bœ7>ß7H8Gg82¯8â8#9 &96G98~98·9ð9 :!):K:a:u:Œ:ª:Á:Ù:ò: ;4";FW;Wž;ö;A <DM<’<«<;Ê<*=+1=-]=‹=.œ=IË=F>\>Ck>¯>>Ï>@?JO?1š?#Ì?ð?* +-@O5@$…@&ª@WÑ@7)A;aA>AÜA0ùA**BUB>nB­B>ÌB8 CDCVC7sC«C:ÁC$üC!DJ7D#‚D/¦D/ÖD%E4,E&aEˆE)§E6ÑE4F=F%]F%ƒF>©F$èF, G1:G6lG-£G#ÑG9õGL/HO|HÌHÝHFìH$3I8XI9‘ILËI$J6=J+tJ' J0ÈJ7ùJ(1K ZK0{K ¬K*ÍK!øKZL\uLYÒLl,M$™M*¾M4éM9N+XN+„N3°N9äN9O3XO1ŒO0¾O)ïOP78P4pPF¥P:ìP'QDQXQ5oQ.¥Q)ÔQ#þQ"RAR\R<mRªR"¾R4áRS5)S!_S SŽS4¨S#ÝS)T+TJT)dTŽTžT³TÆTæTU9UVU)sU!U%¿UGåU?-VjmV[ØVD4WyWW+žW0ÊW)ûW'%XMXaX(xX)¡XËX-àXY(.Y(WY(€Y;©Y(åY Z /Z;PZ4ŒZë:cŽ +-ý}ùŒH8 ¯¨1ÉÔ†˜ûC¡Úô ¨VÃRVzØï­Ða©m+í +-ü  k¯ÜˆOFœÕ•–8MDNf4Ar¼ÊXǤš©qŽv5ÀQV\FBÛ©³£Ú|øÂ4ä¥ÏÅ>–¹$]$«çIJChÑq×\u±"Mïõƒ™ö†hÐM]èòÓpsGß“Nãe@­¦ýwò <_þB™ý‡³vÓ=G±´G„)) 1&‰@õ¬P6¶3L·W<àŠ!7Ö¸¾ÐŒ™Uç.Ôr›SÔ:<gžsø" Æð0A4#ÚEuØê÷aŸQͦ9~`XÀÊ5¬`c‹2‡4þ«&Ç€Ì(9Î>ÍÈK¦{ü‘/[´º”Ã+„hÄ!‘îl<AgŸ ìšN•ÙB’Xª¤6º*oëÅžþôR¥-Ißa‚ª9:ˆâŠ»…Ò8ñ«Çe Ÿ°¡Zió(Î6‚…°(Þ¢SÊ>,i²‹»wÑfÑ@F̤y0J¬nÎåœ|×Úm;Xpx-5³%wH:»Í¿œ1#7‰ÙW¸¿Ÿ?ËÕ­/a[TáFDŠ3·Ïk'Er}~ ,Ä*nÖWçú9'ª.CØÏ0˜O\ 2f^Âb·3÷«%-#\j›v Ä”2e²u;y¡Ð¶’=·kn•÷ø»Oœ®]tL“Dš¶dz‘úÆP…itˆ)P" ð=ÔRáfÞÁ[Zæ?ŒZD½éTÀñòèÿéÁãÉ{ùkÿ žÀûËÇŠóôTö_®§ c±¿H¯ZKÝsÕ™ìpÝäɇ]±ª+ÈÖgz`0o½›³B|L%^ƒp*{"§xϦ£Y´>¹È!£y;U”@Ñ7§Yx“.Lö‡½lÆ,Q[hêvbúÁ ÆÓY˨µI‰/®5/²ÍƒiK—%;¢_›Êr#1º½s§åU8eõÂm} à=€2?˜Ö*˜šu®ÿz„•¥¬$ÁJ^¼¤ c¶$JùIÅt’ È¾&mGØÒÉS¹ +-¢ ñ×do¼'€°VEt_¸Ä¯Ü€ +-UÅ©M¢x~²†—µdA. ×yŒÛÜÝÞßàáâTä­þ!ÕÙ—7gµ+ÌjÓ,—(Kb)°qS3‘”Ëåæ‰èéêëìíîWŽN´ºÎEOüµˆàwã`ïob{|‹6¨q&†Hl‚ó}Ž„j£Ò¹Ìâû¸¿ ’CÛ¡d‹¥jl-‚P…“nRÒæ~¾–ð¼^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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAddress family not supported by protocol familyAdvertise errorAlarm clockAnode table overflowArg list too longArgument list too longArgument out of domainAttempt to remove a non-empty tableAttempting to link in more shared libraries than system limitAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad exchange descriptorBad file descriptorBad file numberBad font file formatBad messageBad request codeBad request descriptorBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan not exec a shared library directlyCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after socket shutdownCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sCross-device linkDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDeadlock situation detected/avoidedDefault Access rights : +-Destination address requiredDevice busyDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDisk quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/table type mismatchError 0Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 136Error 142Error 58Error 59Error 72Error 73Error 75Error 76Error 91Error 92Error in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILEFILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlockFile locking deadlock errorFile name too longFile size limit exceededFile table overflowFile too largeFirst/next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O errorI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal byte sequenceIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid object for operationInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotInvalidate the specified cacheIs a directoryIs a name fileIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink has been severedLink number out of rangeLink points to illegal nameLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed name, or illegal nameMandatory 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 failureMemory exhaustedMessage tables fullMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : `%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection because of resetNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo record locks availableNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such device or addressNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not a XENIX named type fileNot a data messageNot a directoryNot a name fileNot a stream deviceNot availableNot enough spaceNot foundNot found, no such nameNot master server for this domainNot ownerNot supportedNumber of Columns : %d +-Number of objects : %u +-Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKSNumerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation canceledOperation not applicableOperation not permittedOperation not supportedOperation not supported on transport endpointOperation now in progressOperation would blockOption not supported by protocolOut of stream resourcesOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial successPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badReserved for future useResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResult too largeResults sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLETABLE +-TABLE,yesTable Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo many attributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-Use separate cache for each userUser defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter '%s' in class `%s' must be in class `%s'character '%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter 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 valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror getting callers id: %serror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' undefinedfile `%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :`%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in `%s'.netname2user: principal name `%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127warning: while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Galician +-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: %sA liña "Zone %s" e a opción -l son mutuamente exclusivasA liña "Zone %s" e a opción -p son mutuamente exclusivasPrecí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: debe ser meirande ca +-%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 rangoO carácter non debe estar na clase `%s'O carácter non está na clase `%s'?AbortadoDereitos de Acceso : Accedendo a unha biblioteca compartida corrompidaEstase usando o enderezoFamilia de enderezos para o nome do servidor non soportadaO protocolo non soporta esta familia de enderezosA familia de protocolos non soporta esta familia de enderezosAnunciar erroTemporizadorDesbordamento da táboa de anodesLista de parámetros demasiado longaLista de parámetros demasiado longaO argumento non está no seu dominioIntentouse borrar unha táboa non baleiraIntentouse sobrepasa-lo límite de bibliotecas compartidasIntentouse cargar demasiadas bibliotecas compartidasAutentificación correctaErro na autentificaciónOBXECTO FALSO +-Enderezo incorrectoDescriptor de intercambio incorrectoDescriptor de ficheiro incorrectoNúmero de ficheiro incorrectoFormato do ficheiro de tipo de letra incorrectoMensaxe incorrectaCódigo de petición incorrectoDescriptor de petición incorrectoChamada ao sistema incorrectaValor de ai_flags incorrectoSer estrictamente conforme con POSIXDatos binarios +-Precísase dun dispositivo de bloquesProblema cunha chamada multidifusiónCanalización rotaErro no bus de datosCDSLímite de tempo de CPU superadoA caché caducouNon se pode acceder a unha biblioteca compartida necesariaNon se pode executar unha biblioteca compartida directamenteNon se pode conectar co servidor que serve a este dominioNon se pode comunicar co mapeador de portosNon se pode comunicar con `ypbind'Non se pode comunicar con ypservNon se pode reservar memoriaNon se pode asigna-lo enderezo pedidoNon se pode crear un socket para un rpc multidifusiónNon se pode executar unha biblioteca compartida directamenteNon se pode ter máis dunha opción de xeración de ficheiros +-Non se pode recibi-la resposta á multidifusiónNon se pode rexistra-lo servicioNon se pode enviar despois de desconecta-lo socketNon se pode enviar despois de desconecta-lo destino do transporteNon se pode enviar un paquete multidifusiónNon 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 rangoSeparador de Caracteres : %c +-O proceso fillo saíuA credencial do cliente é demasiado febleColumnas : +-Erro de comunicacións ao enviarCompile a especificación do `locale'O ordenador mercou a granxaO 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 rexeitadaConexión reiniciada polo outro estremoA conexión espirouContinuaciónConverti-los ficheiros dados dunha codificación a outra.Converti-la clave a minúsculasCopyright (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ímbolosCrea-la saída incluso se se produciron mensaxes de avisoCrear unha base de datos DB simple a partires da entrada textual.Hora de Creación : %sEnlace a través de dispositivosA entrada DES para o nome de rede %s non é única +-DIRECTORIO +-DNANSDNSA base de datos para a táboa non existeA base de datos está ocupadaSituación de interbloqueo detectada/evitadaDereitos de acceso por Omisión : +-Precísase dun enderezo de destinoDispositivo ocupadoO dispositivo non é de fluxoDispositivo non configuradoDispositivo ou recurso ocupadoDiffie-Hellmann (%d bits) +-Directorio : %s +-Directorio non baleiroCota de disco superadaCota de disco superadaNon bifurcar e visualiza-las mensaxes no terminal actualNon visualizar mensaxes ao construi-la base de datosNon usa-lo catálogo existente, forzar un ficheiro de saída novoNon se conectou co dominioTrampa de EMTENTRADA +-Datos encriptados +-Diferentes tipos de entrada/táboaErro 0Erro 100Erro 101Erro 102Erro 103Erro 104Erro 105Erro 106Erro 107Erro 108Erro 109Erro 110Erro 111Erro 112Erro 113Erro 114Erro 115Erro 116Erro 117Erro 118Erro 119Erro 136Erro 142Erro 58Erro 59Erro 72Erro 73Erro 75Erro 76Erro 91Erro 92Erro no subsistema RPCErro 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 retrochamadaErro: o ficheiro .netrc pode ser lido por outros.Ficheiro de intercambio cheo.Exec erro de formatoFATAL: o sistema non define `_POSIX2_LOCALDEF'FICHEIROO FICHEIRO contén mapeado de nomes simbólicos a valores UCS4Fallo (erro non especificado)Descriptor de ficheiro en mal estadoO ficheiro xa existeInterbloqueo en bloqueos de ficheiroErro de interbloqueo en bloqueos de ficheiroNome de ficheiro demasiado longoLímite de tamaño de ficheiro superadoDesbordamento da táboa de ficheirosFicheiro demasiado grandePrimeira/seguinte cadea rotaExcepción de coma frotantePrecísase unha resincronización completa do directorioFunción non implementadaGRUPO +-Lixo en ARGP_HELP_FMT: %sXera-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éricoObter información específica do `locale'.Devolver unha mensaxe curta sobre o usoDevolver esta lista de axudaErro inxustificadoGrupo : %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á inactivoFallo ao busca-lo nome do servidorErro de E/SE/S posibleFICHEIRO-ENTRADA FICHEIRO-SAÍDA +--o FICHEIRO-SAÍDA FICHEIRO-ENTRADA +--u FICHEIRO-ENTRADATrampa de IOTIVYIdentificador borradoSecuencia de bytes non permitidaInstrucción non permitidaTipo de obxecto non permitido na operaciónBúsqueda non permitidaTipo ou formato de ficheiro inapropiadoioctl inapropiado para o dispositivoOperación inapropiada para un proceso que traballa de fondoPetición de informaciónInformación:Ficheiros de Entrada:Especificación do formato de Entrada/Saída:Erro de Entrada/saídaErro interno de NISErro interno de ypbindInterrupciónChamada ao sistema interrompidaA chamada ao sistema interrompida debería ser recomezadaParámetro incorrectoReferencia cara a atrás incorrectaNome da clase de caracteres incorrectoCredencial do cliente incorrectaVerificador do cliente incorrectoCarácter de ordenación incorrectoContido de \{\} incorrectoEnlace entre dispositivos distintos incorrectoIntercambio incorrectoObxecto incorrecto para a operaciónCarácter ancho ou multibyte incorrecto ou incompletoExpresión regular precedente incorrectaFinal do rango incorrectoExpresión regular incorrectaCódigo de petición incorrectoDescriptor de petición incorrectoVerificador de servidor incorrectoRañura incorrectaInvalida-la caché especificadaÉ un directorioÉ un ficheiro de nomeÉ un ficheiro de tipo con nomeKerberos. +-MatadoENLACE +-A entrada LOCAL para o UID %d no directorio %s non é única +-Nivel 2 detidoNivel 2 non sincronizadoNivel 3 detidoNivel 3 reiniciadoO enlace foi rotoNúmero de enlace fóra de rangoO enlace leva a un nome ilegalTipo do Obxecto Enlazado : Enlazado a : %s +-Nome de dominio local non fixadoFallo ao reservar recursos locaisA máquina non está na redeNome mal formado, ou ilegalOs 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 memoriaMemoria esgotadaTáboas de mensaxes cheasMensaxe demasiado longaFalta un atributo, ou está mal formadoHora de Modificación : %sFallo ao modificarFallo na operación de modificaciónModifica-lo formato de saída:Tentouse un multisaltoNOMENOME +-[-a|-m]NISNon coinciden as versións do cliente e o servidor NIS - non se pode dar servicioA base de datos de mapas NIS está malFallou unha operación NIS+Non se pode chegar aos servidores NIS+O servicio NIS+ non está dispoñible ou instaladoSEN OBXECTO +-NÚMERONome : `%s' +-Demo de Cache de Servicio de Nomes.Nome non servido por este servidorO nome non é único na redeNome ou servicio descoñecidoO nome/entrada non é únicoNon se pode busca-lo obxecto nomeadoPreciso dun autentificadorA rede cortou a conexión debido ao reinicioA rede cortou a conexión por un reinicioA rede non funcionaNon se pode chegar á redeNon hai unha estructura CSI dispoñibleNon hai semáforos XENIX dispoñiblesNon hai un enderezo asociado ao nome de servidorNon hai un enderezo asociado ao nomeNon hai un anodoNon hai espacio dispoñible no bufferNon hai procesos filloNon hai datos dispoñiblesNon hai espacio de ficheiros no servidorNon hai bloqueos dispoñiblesNada coincideNon se atopou o medioNon hai unha mensaxe do tipo desexadoNon hai máis rexistros na base de datos de mapasNon hai unha expresión regular precedenteNon hai bloqueos de rexistro dispoñiblesNon hai programas remotos rexistrados. +-Non hai unha rota ao servidorNon hai espacio libre no dispositivoNon hai tal dispositivoNon hai tal dispositivo ou enderezoNon hai tal ficheiro ou directorioNon hai tal clave no mapaNon hai tal mapa no dominio do servidorNon hai tal procesoNon se atopou un espacio de nomes NIS+Fallo non recuperable na resolución de nomesNingún. +-Non é un ficheiro de tipo nomeado XENIXNon é unha mensaxe de datosNon é un directorioNon é un ficheiro de nomeNon é un dispositivo de fluxoNon dispoñibleNon hai espacio abondoNon atopadoNon atopado, non hai tal nomeNon hai servidor mestre para este dominioNon é o propietarioNon soportadoNúmero de Columnas : %d +-Número de obxectos: %u +-O número de enlaces simbólicos atopados durante o percorrido pola rota supera MAXSYMLINKSParámetro numérico fóra do dominioResultado numérico fóra de rangoObxecto nº %d: +-Nome do Obxecto : %s +-Tipo do Obxecto : O obxecto é remotoXa existe un obxecto co mesmo nomeNúmero de comiñas impar¡Só root pode usar esa opción!A operación xa se está levando a caboOperación canceladaOperación non aplicableOperación non permitidaOperación non soportadaOperación non soportada no punto final do transporteOperación levándose a caboA operación bloquearíaseOpción non soportada polo protocoloAcabáronse os recursos de fluxoAcabáronse os recursos de fluxoControl de saída:Selección de saída:Propietario : %s +-PRIVADO +-Paquete non instaladoErro na análise: %sÉxito parcialO obxecto pasado non é o mesmo obxecto no servidorPermiso denegadoFallo de enerxíaFinal prematura da expresión regularVisualiza-lo contido do ficheiro de base de datos, unha entrada por liñaVisualiza-la estatística da configuración actualVisualizar máis mensaxesVisualiza-la versión do programaÉxito probableProbablemente non atopadoRematado o tempo de perfiladoControlador de protocolos non conectadoErro de protocoloFamilia de protocolos non soportadaProtocolo non dispoñibleProtocolo non soportadoTipo incorrecto de protocolo para o socketPetición ilegal para a táboa nomeadaAbandoarErro específico de RFSMal procedemento RPC para o programaFallo de RPC na operación NISPrograma RPC non dispoñibleVersión incorrecta do programa RPCA estructura RPC é incorrectaVersión de RPC incorrectaRPC: (código de erro descoñecido)RPC: Erro de autentificaciónRPC: Non se pode descodifica-lo resultadoRPC: Non se pode codifica-los parámetrosRPC: Fallo (erro non especificado)RPC: Versións de RPC incompatiblesRPC: Fallo do portmapperRPC: Procedemento non dispoñibleRPC: Programa non rexistradoRPC: Programa non dispoñibleRPC: Non coinciden os programas/versiónsRPC: Erro do sistema remotoRPC: O servidor non pode descodifica-los parámetrosRPC: ÉxitoRPC: Tempo esgotadoRPC: Non se pode recibirRPC: Non se pode enviarRPC: Servidor descoñecidoRPC: Protocolo descoñecidoRSA (%d bits) +-Úsase RTLD_NEXT en código non cargado dinamicamenteLer e visualiza-los datos do perfil do obxecto compartidoLe-los datos de configuración de NOMESistema de ficheiros de só lecturaSinal de tempo real %dExpresión regular demasiado grandeErro de E/S remotaO enderezo remoto cambiouElimina-lo contrasinal ou face-lo ficheiro ilexible por outros.A apertura do obxecto compartido `%s' fallouReplicar : +-Informe dos erros a %s. +-Informe dos erros usando o script `glibcbug' a . +-Parámetros da petición incorrectosReservado para uso futuroErro do resolvedor 0 (sen erro)Erro interno do resolvedorInterbloqueo de recursos evitadoRecurso perdidoRecurso non dispoñible temporalmenteResultado demasiado grandeResultado enviado ao procedemento callbackSOBJ [PROFDATA]SUNYPRota de Búsqueda : %s +-Fallo de segmentoServidor ocupado, probe outra vezServidor sen memoriaO servidor rexeitou a credencialO servidor rexeitou o verificadorServname non soportado para ai_socktypeEstablece-lo nome do programaApaga-lo servidorSinal 0Operación de socket nun non-socketTipo de socket non soportadoUn programa abortou a conexiónSíntocho. Non es root +-As definicións de fonte atópanse en FICHErro de srmountFallo de pilaManexador de ficheiro NFS trabucadoComezar NÚMERO fíosEstado : %s +-DetidoDetido (sinal)Detido (entrada do terminal)Detido (saída do terminal)Erro de canalización de fluxoA estructura precisa dunha limpezaÉxitoElimina-las mensaxes de aviso e informaciónNomes de caracteres simbólicos definidos en FICHErro de sistemaInformación do sistema:Fallo ao reservar recursos do sistemaDirectorio do sistema para mapas de caracteres : %s +- mapas de repertorios: %s +- locale : %s +-%sTÁBOATÁBOA +-TÁBOA,siTipo de Táboa : %s +-Fallo temporal na resolución de nomesTerminadoFicheiro de texto en usoA 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 tempoDemasiados atributosDemasiados niveis de enlaces simbólicosDemasiados enlacesDemasiados ficheiros abertosDemasiados ficheiros abertos no sistemaDemasiados procesosDemasiadas referencias: non se pode unirDemasiados usuariosTrampa de seguemento/punto de rupturaBarra invertida extra ó finalO proceso traductor morreuO destino do transporte xa está conectadoO destino do transporte non está conectadoEscriba `%s --help' ou `%s --usage' para obter máis información. +-Probando %s... +-Tipo : %s +-DESCOÑECIDONon se pode autentifica-lo cliente NIS+Non se pode autentifica-lo servidor NIS+Non se pode crea-lo callbackNon se pode crear un proceso no servidorDescoñecido (tipo = %d, bits = %d) +-Clave %s descoñecida no .netrcCódigo de erro NIS descoñecidoBase de datos descoñecida: %s +-Erro descoñecidoErro descoñecido Servidor descoñecidoObxecto descoñecidoOpción descoñecida: %s %s %sErro do resolvedor descoñecidoErro do servidor descoñecidoSinal %d descoñecidaErro de sistema descoñecidoErro de ypbind descoñecido( ou \( sen parella) ou \) sen parella[ ou [^ sen parella\{ sen parellaVariable `%s' non recoñecidaCondición de E/S urxenteUso:Uso: %s nome_variable [nome] +-Uso: rpcinfo [ -n numport ] -u host numprog [ numvers ] +-Usar unha caché separada para cada usuarioSinal 1 definido polo usuarioSinal 2 definido polo usuarioValor grande de máis para o tipo de datos definidoTempo virtual esgotadoResultado salvaxe da execución do comandoA ventá cambiouEscribi-los nomes dos mapas de caracteres dispoñiblesEscribi-los nomes dos `locales' dispoñiblesEscribi-los nomes das categorías seleccionadasEscribi-los nomes das claves seleccionadasEscribi-la saída no ficheiro NOMEEscrito por %s. +-Tipo de medio incorectoX500XCHSYPBINDPROC_DOMAIN: %s +-Si, 42 é o significado da vidaSi que a fastidiaches esta vezA 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ñecidoai_family non soportadoai_socktype non soportadoxa en execucióno parámetro de <%s> debe ser un só caráctero parámetro de `%s' debe ser un só carácterauth_none.c - Problema fatal de ordenaciónauthunix_create: memoria esgotada +-parámetro incorrectopropietario incorrectocampo FROM baleiro na liña Linkcampo TO baleiro na liña Linkbloque 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 buffercache_set: non se puido reserver un novo rpc_buffercache_set: fallou a reserva de espacio para o obxectivocache_set: obxectivo non atopadonon podo determina-la abreviatura do fuso horario a usar despois da horanon 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ímbolosnon se pode crear un descriptor internonon se poden crear descriptores internosnon se pode facer que o socket acepte conexións: %snon 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 é %dnon se pode inserta-lo elemento de ordenación `%.*s'non se pode insertar na táboa de resultadosnon se pode inserta-la nova definición de símbolo de ordenación: %snon se pode carga-los datos de perfísnon se pode abrirnon se pode abrir `%s'non se pode abri-lo ficheiro de bases de datos `%s': %snon 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ídanon 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: %snon se pode procesa-la especificación de ordenon se pode ler no directorio de mapas de caracteres `%s'non se pode le-lo ficheiro de configuración; isto é fatalnon se pode ler do clientenon 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ísticosnon se pode facer stat() sobre o ficheiro `%s': %snon se poden escribi-los ficheiros de saída a `%s'non se pode escribi-lo resultado: %snon se poden escribi-las estatísticas: %snon se pode escribir no clientedatos de categoría pedidos máis dunha vez: non debería ocorrero 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 non definido no mapa de caractereso 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ónclase de caracteres `%s' xa definidamapa de caracteres `%s' xa definidoficheiro de mapa de caracteres `%s' non atopadoclnt_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 ignoradao elemento de ordenación `%.*s' aparece máis dunha vez: liña ignoradaesperábase un símbolo de ordenación despois de `%s'conectarse ao enderezo %s: esperábase unha constante ou un identificadorconversión de `%s' a `%s' non soportadaconversión detida debido a un problema escribindo na saídanon 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 atopadoa 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ácternome do carácter `%s' duplicadodefinición do elemento de ordenación duplicadadefinición do carácter `%.*s' duplicadaclave duplicadadefinición de conxunto duplicadafuso horario %s duplicado (ficheiro "%s", liña %d)identificador de mensaxes duplicadonúmero de mensaxe duplicadocadea de caracteres baleiranome de peso baleiro: liña ignoradaenablecache: caché xa activadaenablecache: 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ídacodificación do texto orixinalo final do rango dos puntos suspensivos é maior que o principioerro ao obte-lo identificador do chamante: %serro ao pecha-la entrada `%s'erro ao pecha-lo ficheiro de saídaerro ao pecha-lo ficheiro de datos de perfíserro ao inserta-lo elemento de ordenación na táboa hasherro ao insertar na táboa hasherro ao ler da entradaespérase un parámetro de cadea para `copy'non se atopou a liña de continuación que se esperabanon se puido carga-lo obxecto compartido `%s'non se puideron carga-los datos de símbolosnon se puido facer mmap sobre o ficheiro de datos de perfísnon se puido comeza-lo procesamento de conversiónnon se puideron escribi-los datos da categoría `%s'fcntl: F_SETFDcampo `%s' na categoría `%s' non definidoo ficheiro `%s' xa existe e pode ser sobreescrito +-o valor-dende do `elemento-de-ordenación' debe ser unha cadeafallou a chamada a fstatlixo á fin da especificación do código de caractereslixo á fin do númerolixo á 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 chamadasxerar un perfil plano con contas e temposget_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ólicoten un enlace duro nalgún sitiocampo CORRECTION ilegal na liña Leapcampo Rolling/Stationary ilegal na liña Leapconstante de caracteres ilegal na cadeacarácter ilegal no ficheiro: elemento de ordenación ilegaldefinición ilegalcodificación dada ilegalsecuencia de escape ilegal á fin da cadeasecuencia de entrada ilegal na posición %ldnomes ilegais para o rango de caracterestipo de rede ilegal :`%s' +-número ilegal para o desprazamento na cadea %d no campo `era' da categoría `%s'número de conxunto ilegaldata 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 caractereslímite da implementación: non se admiten máis de %d mapas de caracteressecuencia de caracteres incompleta á fin do bufferficheiro con formato incorrectoliña de entrada de tipo descoñecidoerro interno (descriptor ilegal)erro interno - chamouse a addtype cun isdst incorrectoerro interno - chamouse a addtype cun ttisgmt incorrectoerro interno - chamouse a addtype cun ttisstd incorrectoerro interno en %s, liña %udesprazamento UTC incorrectoformato de abreviatura incorrectodía do mes incorrectoano final incorectoano bisesto incorrectomodo incorrecto para dlopen()nome do mes incorrectohora gravada incorrectaano de inicio incorrectohora do día incorrectadía da semana incorrectolonxitude da clave da petición demasiado grande: %Zda liña tralos puntos suspensivos debe conte-la definición dun caráctera liña antes dos puntos suspensivos non contén a definición dunha constante de carácterliña demasiado longalistar tódolos conxuntos de caracteres codificados que se coñecennon se atopou o ficheiro de locale `%s', usado na instrucción `copy'fallou a chamada a lstatignórase unha liña mal formadafallou o mapeado da táboa de cadeas da cabeceira da secciónfallou o mapeado das cabeceiras da secciónmemoria alterada antes do bloque reservado +-memoria alterada despois do bloque reservado +-memoria esgotadaa 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 nomenon se especificou unha codificación nin do orixinal nin do destinonetname2user: (busca nis+): %s +-netname2user: a entrada DES de %s no directorio %s non é únicanetname2user: a entrada LOCAL de %s no directorio %s non é únicanetname2user: non se atopou unha lista de identificadores de grupo en `%s'netname2user: nome principal `%s' demasiado longonetname2user: non debería ter uid 0prog %d nunca rexistrado +-non se deu un valor ou non hai unha expresión regular correcta para o campo `%s' da categoría `%s': %sningún día do mes coincide coa regranon 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-nomenon se debe especificar outra clave cando se usa `copy'non se producíu un ficheiro de saída porque se deron avisosnon se especificou un mapa de repertorio: non se pode procedernon se deu un nome simbóliconon se deu un nome simbólico para a fin do rangonon se definíu un peso para o símbolo `%s'non é un ficheiro normalconfiguració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 CHARMAPa codificación orixinal non foi especificada usando `-f'ficheiro de saídapmap_getmaps problema de rpcpoll: fallo de protocolo no establecemento do circuito +-erro de preprocesadorvisualiza-la lista de rotas de conta e o seu número de usovisualiza-la información do progresoproblemas 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 repetidoo ficheiro de mapa de repertorios `%s' non foi atopadorpcgen: 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 portmappero mesmo nome de regra aparece en varios ficheiroslectura demasiado curta ao le-la clave de petición: %slectura demasiado curta ao le-la petición: %sescritura demasiado curta en %s: %ssocket: fallo do protocolo no establecemento do circuito +-as direccións de ordenación `forward' e `backward' son mutuamente excluíntesa especificación do peso na ordenación do símbolo de ordenación non ten sentidoentrada estándarsaída estándara data de comezo é ilegal na cadea %d no campo `era' da categoría `%s'o ano de comezo é maior có ano finalo ano de comezo é demasiado grande para ser representadoo ano de comezo é demasiado pequeno para ser representadoa data de finalización é ilegal na cadea %d no campo `era' da categoría `%s'svc_run: - fallou a chamada a selectsvc_tcp.c - non se pode chamar a getsockname ou listensvc_tcp.c - problema ao crear un socket tcpsvc_tcp: makefd_xprt: memoria esgotada +-svc_unix.c - problema ao crear un socket AF_UNIXsvc_unix.c - non se pode chamar a getsockname ou listensvc_unix: makefd_xprt: memoria esgotada +-svctcp_create: memoria esgotada +-svcudp_create - non se pode chamar a getsocknamesvcudp_create: memoria esgotada +-svcudp_create: problema ao crear un socketsvcunix_create: memoria esgotada +-o símbolo do elemento de ordenación multicarácter `%.*s' duplica a definición dun elementoo símbolo do elemento de ordenación multicarácter `%.*s' duplica a definición doutro símboloo símbolo do elemento de ordenación multicarácter `%.*s' duplica a definición dun símboloo símbolo do elemento de ordenación multicarácter `%.*s' duplica un nome simbólico no conxunto de caractereserro de sintaxe na definición %s: %serro de sintaxe na directiva `order_start'erro de sintaxe na definición da clase de caractereserro de sintaxe na definición de conversión de caractereserro de sintaxe na definición de ordenaciónerro de sintaxe na definición de ordenaciónerro de sintaxe na definición da categoría LC_CTYPEerro de sintaxe na definición da nova clase de caractereserro de sintaxe na definición dun novo mapa de caractereserro de sintaxe na definición do locale de mensaxeserro de sintaxe na definición do locale monetarioerro de sintaxe na definición do locale numéricoerro de sintaxe na especificación de ordeerro de sintaxe no prólogo: %serro de sintaxe na definición do mapa de repertorio: %serro de sintaxe na definición do locale de data/horaerro de sintaxe: non está dentro dunha sección de definición de localea codificación do destino non foi especificada usando `-t'esta é a primeira definicióntempo antes de cerodesbordamento de tempodemasiados poucos bytes na codificación de caracteresdemasiados bytes na codificación de caracteresdemasiadas clases de caracteres definidasdemasiados segundos de compensacióndemasiados tipos de hora local!¿demasiadas transicións?!demasiados pesosdemasiadas abreviaturas de fuso horario, ou demasiado longaslixo na fin da liñaproblemas ao respostar ao prog %d +-non se permiten dúas liñas nunha fila contendo `...'ano único con tiponon se pode reservar espacio para o buffer de entradanon se pode libera-los parámetrosnon definidocarácter `%s' descoñecidocarácter descoñecido no campo `%s' da categoría `%s'directiva de ordenación descoñecidadirectiva `%s' descoñecida: liña ignoradaerro %d de iconv() descoñecidoconxunto `%s' descoñecidosímbolo `%.*s' descoñecido: liña ignoradafuso sen regrasmensaxe non rematadacadea non rematadaconstante de cadea non rematadanome simbólico non rematadonome de peso non rematadoo límite superior do rango non é menor có límite inferioruso: %s ficheiro-de-entrada +-uso do 29 de febreiro nun ano non bisestoo valor de %s debe ser un enteiroo valor de <%s> debe caer entre 1 e 4o valor do campo `%s' da categoría `%s' non debe ser unha cadea baleirao valor de debe ser maior có valor de o valor do campo `int_curr_symbol' da categoría `LC_MONETARY' non corresponde a un nome válido en ISO 4217o valor do campo `int_curr_symbol' da categoría `LC_MONETARY' ten unha lonxitude incorrectaos valores do campo `%s' da categoría `%s' deben ser menores que 127aviso: ao aceptar unha conexión: %sao reservar espacio para a entrada de cachéao reservar espacio para a entrada da táboa hashao reservar espacio para a copia da claveao abrir un antigo ficheiro de catálogoao prepara-la saídaao le-la base de datosao avalia-lo ficheiro de datos de perfísao escribir no ficheiro de bases de datosescritura incompletaescribible por alguén distinto do propietarionúmero de parámetros incorrectonúmero de campos na liña Leap incorrectonúmero de campos na liña Link incorrectonúmero de campos na liña Rule incorrectonúmero de campos na liña de continuación de Zone incorrectonúmero de campos na liña Zone incorrectoxdr_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 @@ +-Þ•Úì'¼=XRYRlRMREÍR&S(:ScStSŒSžS­SÁSÜSöSn +-TyU‹U"U"ÀUãU:ÿU:VCVLVbVyV“VªVÄVÝVùVW.WHWeW}W›W¢W ½WÊWÑW3ãW3X4KX.€X%¯XÕX&éX%Y6Y%MY3sY,§Y)ÔYþY"Z!:Z\ZsZŒZ¦ZÀZÖZéZ*ÿZ*[&D[&k[&’[&¹[&à[\ \$@\e\€\š\,´\á\%ÿ\,%]-R] €]&¡]È]ç]^ ^;^[^‰{^2_8_"X_4{_°_#Â_ æ_=ð_.`<?`|`'œ`Ä`)Í`(÷` aAaCaKa$\aa)˜a(Âa/ëab +b7bLb^bub#Œb=°b/îbc0c Ec Sc_cwc‹c›c °c¼cÍcäcôc d %d2dHd _d kdudyd ‘d&Ÿd&Æd-íd!e=e[eyee&°e%×e0ýe!.fPf!hf-Šf¸f%Õf)ûf'%g%Mg&sgšg¶g ÐgÝgøgh+hHh@ahD¢hçhúhi (i=2ipiÇŠiRj7qj2©j-Üj +-kk$/k +-Tk_kek!ik‹k#œkÀkÙk ökll,lDl_lsl‡l›l3¯l-ãl2mDmUm^memumm —m ¡m «m µm ¿m Ém Óm Ým çm ñm ûm n n n #n -n 7n An Kn Un _n insn|n…nŽn—n n©n²n»n<Òno$/o)To ~oŒo1žoÐo8Õop)p FpRphp„p—p°pÄpÓpëp"q'q@qGqŽdqóq r)rDrXrir }r‹r$«rÐr"×r%úr" s"Cs%fs Œs™s ²s ¼s>Ésttt(t>t!Rt tt!t£t.Âtñt u u"uBuUuhu ~uˆu+ uÌuÝuôuv+vCv_vwv‘v¢v1¿v$ñvw(wCwXwsw ‹w˜w·wÆwÕw +-êwõwüw2x5xDx]x lxzxx©xÅxÛxëx!y'yEyseyÙy*êyz/z@zTzez„z—z«zÃzÙzìz ñzþz9{<{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Œ…Œ™Œ®ŒÁŒÚŒ*âŒ( 6C"WƒzþŽ ŽŽ$/Ž +-TŽ_Ž«nŽ *8!Ln}‘¯"Âåô +-‘‘'-‘#U‘6y‘ °‘ +-¾‘É‘"Ñ‘"ô‘’"1’T’t’Ž’¥’ »’É’ Ø’å’ô’ “$“9“K“`“u“‡“™“ «“¸“Ó“è“#ï“:” N”o”…”%›”Á”"×”ú”! • +•"L• o••ª•º•Ì•Ñ•Ö•í• –F)– p–4z–.¯–-Þ–6 —8C—;|—I¸—˜˜4˜+D˜+p˜'œ˜Ę ä˜ ñ˜û˜™5™&H™.o™&ž™Å™,Õ™š!šC=š#š¥šÄš!àš"›.%› T›%u›;››&×›þ›1œPœ kœwœ"ˆœ«œ'Çœïœ.$S"j(-¶äü!ž;žXžxž”ž!°žÒžêžŸ9Ÿ2WŸ6ŠŸ+ÁŸ?íŸC- 8q $ª "Ï !ò .¡C¡b¡¡<¡¡;Þ¡$¢?¢W¢*w¢7¢¢Ú¢"ù¢£)/£NY£U¨£þ£&¤)C¤ m¤{¤+”¤À¤Þ¤ø¤ +-¥"*¥%M¥*s¥*ž¥É¥Ý¥0÷¥(¦E¦d¦+„¦7°¦#è¦ §!*§$L§!q§“§&®§%Õ§,û§(¨%7¨0]¨2Ž¨ Á¨.Ψý¨K©Lb©L¯©ü©+ª2<ª2oª/¢ª$Òª÷ª% «-3«$a«†«¢«¼«Ï«(æ«&¬!6¬X¬Fo¬¶¬BɬB ­?O­<­7Ì­®®#:®.^®0®0¾®ï® ¯ ¯<¯Q¯e¯z¯”¯§¯º¯Яä¯#ù¯5°GS° ›°#©°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#¾Oy¾Vɾ! ¿'B¿*j¿/•¿*Å¿$ð¿/À1EÀ/wÀ)§À*ÑÀ)üÀ#&ÁJÁ-eÁ&“Á4ºÁ(ïÁÂ5 FÂ#TÂ$xÂ"ÂÀÂÖÂðÂÃ.ÃGÃgÃ3„øÃ#ÊÃîà ÄÄ0(ÄYÄ$uĚijÄ#ÄÄ èÄôÄ ÅÅ:ÅUÅ4nţŵÅÒÅ'òÅ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Ø$šØˆ¿Ø1HÙzÙ4˜Ù>ÍÙ Ú+#Ú OÚD]Ú¢Ú<³Ú#ðÚ'Û <Û1HÛ3zÛ)®ÛØÛÚÛãÛ-ùÛ'Ü2<Ü2oÜA¢ÜäÜ ôÜ"Ý"#Ý"FÝiÝ/…ÝDµÝ1úÝ,Þ>Þ WÞeÞ!zޜ޻Þ#ÚÞþÞß#2ßVßuß“ß ­ß%ºßàß +-ÿß +-àà#à <à9Jà8„à;½à(ùà!"á!Dáfá+ƒá0¯á8àá:â.Tâ"ƒâ/¦âAÖâ*ã7Cã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üLfü(³üÜüôü5ýHýZý aý(ný!—ý¹ýØýôý$ þ2þ6Iþ6€þ ·þÅþ"áþ&ÿ1+ÿ']ÿ …ÿ$“ÿ¸ÿÓÿ"ðÿ0G(e1Ž)À&ê$6$Uz#’¶Ó%ï#*.N }‡§ÂÖí  3?)]‡ ©Ã`Û$<a €Ž¥¹$Ìñ$3Ka|”3«ßû";Zy§»ÄÝó4:J(\<…2Âõ ,?Y#t˜#­Ñì* &. U Z )r #œ À $Þ  +- +-#8 +-\ +-*z +-)¥ +-%Ï +-"õ +- 3 R p * º 1Ù   , F _ u  ‘ 4Ÿ =Ô & 9 U "j  !¢ @Ä 1 7D>[$š¿%Øþ! <'Jr,Š·ÈÎèû %7&]$„©Ç Û&å 1'Y%r˜ ª¶Îãû,D(^‡0-Áï.žJéñ +-ú1 Q[Én8 HV g ˆ”§Æ(Ö ÿ &7$M$r=—Õ +-å ð&ü&#J)i"“&¶#Ý-ARf„£ÁØö&9L[{•"š9½&÷=1\Ž-¤Ò2ä.)F-pž¼Ìâçì"/&mV ÄCÎ0?CBƒ;Æ: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(%]()ƒ(-­($Û(')()DH)A)EÏ)4*OJ*Sš*Fî*%5+$[++€+9¬+!æ+!,"*,FM,F”,+Û,-'&-&N-Ku-!Á-/ã-.7).`a.eÂ.(/-H/,v/£/³/.Ó/#0&0B0$]0 ‚0*£04Î05191O1@l1'­1Õ1"ó132CJ2(Ž2·2%Ð2ö2-3'C39k3/¥32Õ34147I4D4 Æ4<Ô45e15`—5`ø5 Y6*z6?¥60å667*M7 x7*™72Ä7)÷7!8?8_8t8*8.º8+é89Y,9†9M£9Kñ9B=:A€:=Â:!;"";%E;2k;4ž;4Ó;<&<$A<f<}<<¦<Â<×<í<==86=Bo=E²=ø=/ +->F:> >>I¨>,ò>/?6O?†?,—?PÄ?M@c@Mr@ À@>á@@ A2aA/”A"ÄA+çA5BPIB.šB"ÉBlìB>YC9˜C=ÒCD9.D(hD‘D;¨DäDDÿD6DE{EŠE4§EÜE5õE!+FMFRdF#·F8ÛF;G(PG)yG)£GÍG(ìG$H):HdH!{H&HYÄHI->I!lI8ŽI.ÇI öI6J@NJIJÙJèJMøJ'FK4nK5£KSÙK-L1GL0yL'ªL5ÒL2M(;M dM,…M ²M/ÓM!Nb%NhˆN`ñNWRO.ªO0ÙO? +-PDJP>P5ÎP-QE2QDxQG½QCRBIR1ŒR"¾R=áRCSIcS<­SêST T-3T'aT#‰T­TÈTäT ùT3U9U%YU7U·U*ÍU"øU V(V9CV#}V)¡V ËVìV)W/WAWYWoWŽW«W@ÆWX"X":X0]XQŽXIàXn*YY™YJóY >ZKZiZ!„Z¦Z$ÆZëZÿZ)[>[][)n[˜['¶['Þ['\8.\'g\ \ °\4Ñ\7]ë:cŽ +-ý}ùŒH8 ¯¨1ÉÔ†˜ûC¡Úô ¨VÃRVzØï­Ða©m+í +-ü  k¯ÜˆOFœÕ•–8MDNf4Ar¼ÊXǤš©qŽv5ÀQV\FBÛ©³£Ú|øÂ4ä¥ÏÅ>–¹$]$«çIJChÑq×\u±"Mïõƒ™ö†hÐM]èòÓpsGß“Nãe@­¦ýwò <_þB™ý‡³vÓ=G±´G„)) 1&‰@õ¬P6¶3L·W<àŠ!7Ö¸¾ÐŒ™Uç.Ôr›SÔ:<gžsø" Æð0A4#ÚEuØê÷aŸQͦ9~`XÀÊ5¬`c‹2‡4þ«&Ç€Ì(9Î>ÍÈK¦{ü‘/[´º”Ã+„hÄ!‘îl<AgŸ ìšN•ÙB’Xª¤6º*oëÅžþôR¥-Ißa‚ª9:ˆâŠ»…Ò8ñ«Çe Ÿ°¡Zió(Î6‚…°(Þ¢SÊ>,i²‹»wÑfÑ@F̤y0J¬nÎåœ|×Úm;Xpx-5³%wH:»Í¿œ1#7‰ÙW¸¿Ÿ?ËÕ­/a[TáFDŠ3·Ïk'Er}~ ,Ä*nÖWçú9'ª.CØÏ0˜O\ 2f^Âb·3÷«%-#\j›v Ä”2e²u;y¡Ð¶’=·kn•÷ø»Oœ®]tL“Dš¶dz‘úÆP…itˆ)P" ð=ÔRáfÞÁ[Zæ?ŒZD½éTÀñòèÿéÁãÉ{ùkÿ žÀûËÇŠóôTö_®§ c±¿H¯ZKÝsÕ™ìpÝäɇ]±ª+ÈÖgz`0o½›³B|L%^ƒp*{"§xϦ£Y´>¹È!£y;U”@Ñ7§Yx“.Lö‡½lÆ,Q[hêvbúÁ ÆÓY˨µI‰/®5/²ÍƒiK—%;¢_›Êr#1º½s§åU8eõÂm} à=€2?˜Ö*˜šu®ÿz„•¥¬$ÁJ^¼¤ c¶$JùIÅt’ È¾&mGØÒÉS¹ +-¢ ñ×do¼'€°VEt_¸Ä¯Ü€ +-UÅ©M¢x~²†—µdA. ×yŒÛÜÝÞßàáâTä­þ!ÕÙ—7gµ+ÌjÓ,—(Kb)°qS3‘”Ëåæ‰èéêëìíîWŽN´ºÎEOüµˆàwã`ïob{|‹6¨q&†Hl‚ó}Ž„j£Ò¹Ìâû¸¿ ’CÛ¡d‹¥jl-‚P…“nRÒæ~¾–ð¼^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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAddress family not supported by protocol familyAdvertise errorAlarm clockAnode table overflowArg list too longArgument list too longArgument out of domainAttempt to remove a non-empty tableAttempting to link in more shared libraries than system limitAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad exchange descriptorBad file descriptorBad file numberBad font file formatBad messageBad request codeBad request descriptorBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan not exec a shared library directlyCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after socket shutdownCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sCross-device linkDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDeadlock situation detected/avoidedDefault Access rights : +-Destination address requiredDevice busyDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDisk quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/table type mismatchError 0Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 136Error 142Error 58Error 59Error 72Error 73Error 75Error 76Error 91Error 92Error in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILEFILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlockFile locking deadlock errorFile name too longFile size limit exceededFile table overflowFile too largeFirst/next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O errorI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal byte sequenceIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid object for operationInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotInvalidate the specified cacheIs a directoryIs a name fileIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink has been severedLink number out of rangeLink points to illegal nameLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed name, or illegal nameMandatory 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 failureMemory exhaustedMessage tables fullMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : `%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection because of resetNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo record locks availableNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such device or addressNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not a XENIX named type fileNot a data messageNot a directoryNot a name fileNot a stream deviceNot availableNot enough spaceNot foundNot found, no such nameNot master server for this domainNot ownerNot supportedNumber of Columns : %d +-Number of objects : %u +-Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKSNumerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation canceledOperation not applicableOperation not permittedOperation not supportedOperation not supported on transport endpointOperation now in progressOperation would blockOption not supported by protocolOut of stream resourcesOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial successPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badReserved for future useResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResult too largeResults sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLETABLE +-TABLE,yesTable Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo many attributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-Use separate cache for each userUser defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter '%s' in class `%s' must be in class `%s'character '%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter 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 valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror getting callers id: %serror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' undefinedfile `%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :`%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in `%s'.netname2user: principal name `%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127warning: while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Italian +-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 siLunghezza 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: %sLa riga "Zone %s" e l'opzione -l sono mutuamente esclusiveLa 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: deve essere maggiore di +-%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'intervalloIl carattere non deve essere nella classe `%s'Il carattere non è nella classe `%s'?AbortitoDiritti di Accesso : Accesso ad una libreria condivisa danneggiataIndirizzo già in usoFamiglia dell'indirizzo non gestita per l'hostnameFamiglia dell'indirizzo non gestita dal protocolloFamiglia dell'indirizzo non gestita dalla famiglia del protocolloAdvertise errorAlarm clockOverflow della tabella degli anodeLista degli argomenti troppo lungaLista degli argomenti troppo lungaArgomento fuori dal dominioSi è tentato di rimuovere una tabella non vuotaSi è tentato di linkare più librerie condivise del limite di sistemaSi è tentato di linkare troppe librerie condiviseAutenticazione OKErrore di autenticazioneBOGUS OBJECT +-Indirizzo non validoDescrittore di scambio non validoDescrittore di file non validoDescrittore di file non validoFormato del file di font non validoMessaggio non validoCodice di richiesta non validoDescrittore di richiesta non validoChiamata di sistema non validaValore di ai_flags non validoConformità POSIX rigorosaDati binari +-È necessario un dispositivo a blocchiProblema di poll del broadcastPipe rottaBus errorCDSSuperato il limite del tempo di CPUCache scadutaImpossibile accedere ad una libreria condivisa necessariaImpossibile eseguire direttamente una libreria condivisaImpossibile fare il bind al server che serve questo dominioImpossibile comunicare con il portmapperImpossibile comunicare con ypbindImpossibile comunicare con ypservImpossibile allocare memoriaImpossibile assegnare l'indirizzo richiestoImpossibile creare il socket per l'rpc broadcastImpossibile eseguire direttamente una libreria condivisaImpossibile avere più di un flag di generazione del file! +-Impossibile ricevere una risposta al broadcastImpossibile registrare il servizioImpossibile inviare dopo lo shutdown del socketImpossibile inviare dopo lo shutdown dell'estremità del trasportoImpossibile inviare il pacchetto broadcastImpossibile impostare l'opzione del socket SO_BROADCASTImpossibile 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'intervalloSeparatore dei caratteri: %c +-Il figlio è uscitoCredenziale del client troppo deboleColonne: : +-Errore di comunicazione durante sendCompila la specifica di localizzazioneIl computer ha tirato le cuoiaCalcolo 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 rifiutataConnessione abbattuta dal corrispondenteTimeout della connessioneContinuatoConverte in un'altra codifica la codifica dei file indicati.Converte la chiave in minuscoloCopyright (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 simboliCrea l'output anche se sono stati emessi messaggi di avvertimentoCrea un semplice database DB dall'input testuale.Orario di creazione : %sLink tra dispositiviLa voce DES per il netname %s non è unica +-DIRECTORY +-DNANSDNSNon esiste un database per la tabellaIl database è occupatoIndividuata/evitata una situazione di deadlockDiritti di accesso predefiniti: +-È necessario l'indirizzo di destinazioneDispositivo occupatoIl dispositivo non è uno streamDispositivo non configuratoDispositivo o risorsa occupataDiffie-Hellmann (%d bit) +-Directory : %s +-La directory non è vuotaSuperata la quota di discoSuperata la quota di discoNon fa fork e stampa i messaggi sul tty correnteNon stampa messaggi mentre crea il databaseNon usa il catalogo esistente, forza un nuovo file di outputDominio non collegatotrap EMTENTRY +-Dati cifrati +-I tipi di voce/tabella non coincidonoErrore 0Errore 100Errore 101Errore 102Errore 103Errore 104Errore 105Errore 106Errore 107Errore 108Errore 108Errore 110Errore 111Errore 112Errore 113Errore 114Errore 115Errore 116Errore 117Errore 118Errore 119Errore 136Errore 142Errore 58Errore 59Errore 72Errore 73Errore 75Errore 76Errore 91Errore 92Errore nel sottosistema RPCErrore 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 callbackErrore: il file .netrc è leggibile da altri.Scambio pienoErrore di formato di execFATALE: il sistema non definisce `_POSIX2_LOCALEDEF'FILEFILE contiene la mappatura dai nomi simbolici ai valori UCS4Fallito (errore non specificato)Il descrittore di file è in uno stato non validoIl file esisteDeadlock durante il locking del fileErrore di deadlock durante il locking del fileNome del file troppo lungoSuperato il limite di dimensione del fileOverflow della tabella dei fileFile troppo grandeLa prima/prossima catena è rottaErrore di virgola mobileÈ necessario un resync completo per la directoryFunzione non implementataGRUPPO +-Spazzatura in ARGP_HELP_FMT: %sGenera 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 genericoLegge le informazioni specifiche alla localizzazione.Dà un breve messaggio di istruzioniDà questa lista di aiutoErrore gratuitoGruppo : %s +-Flag del gruppo: Voce del gruppo per il gruppo "%s.%s": +-Si blocca per SECS secondi (predefiniti 3600)HangupNon 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'hostErrore di I/OI/O possibileINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEtrap IOTIVYIdentificatore rimossoSequenza di byte illecitaIstruzione illecitaTipo di oggetto illecito per l'operazioneSeek illecitoTipo di file o formato non appropriatoIOCTL non appropriata per il dispositivoOperazione non appropriata per un processo sullo sfondoRichiesta di informazioniInformazioni: File di input:Specifiche del formato di input/output:Errore di input/outputErrore interno di NISErrore interno di ypbindInterruzioneChiamata di sistema interrottaLa chiamata di sistema interrotta deve essere ricominciataArgomento non validoRiferimento all'indietro non validoNome della classe di caratteri non validoCredenziali del client non valideVerificatore del client non validoCarattere di collazione non validoContenuto di \{\} non validoLink tra dispositivi non validoScambio non validoOggetto non valido per l'operazioneCarattere largo o multibyte non valido o incompletoEspressione regolare precedente non validaFine dell'intervallo non validaEspressione regolare non validaCodice di richiesta non validoDescrittore di richiesta non validoVerificatore di server non validoSlot non validoInvalida la cache indicataÈ una directoryÈ un file con nomeÈ un tipo di file con nomeKerberos. +-UccisoLINK +-La voce LOCAL per l'UID %d nella directory %s non è unica +-Livello 2 fermatoLivello 2 non sincronizzatoLivello 3 fermatoLivello 3 reinizializzatoIl link è stato tagliatoNumero del link fuori dall'intervalloIl link punta a un nome illecitoTipo di oggetto collegato : Collegato a : %s +-Il nome del dominio locale non è stato impostatoErrore di allocazione delle risorse localiLa macchina non è in reteNome malformato o illecitoGli 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 memoriaMemoria esauritaTabelle dei messaggi pieneMessaggio troppo lungoAttributo mancante o malformatoOrario di modifica: %sModifica fallitaOperazione di modifica fallitaModifica il formato di output:Tentato un multihopNOMENOME +-[-a|-m]NISversioni di client/server NIS incompatibili - non si può fornire il servizioIl database della mappa NIS non è validoOperazione NIS+ fallitaServer NIS+ non raggiungibileIl servizio NIS+ non è disponibile o non è installatoOGGETTO MANCANTE +-NUMERONome : `%s' +-Demone di caching del servizio dei nomi.Nome non servito da questo serverIl nome non è unico sulla reteNome o servizio sconosciutoIl nome/voce non è unicoL'oggetto indicato non è ricercabileServe un autenticatoreLa rete ha lasciato cadere la connessione per il resetLa rete ha lasciato cadere la connessione per il resetLa rete è giùLa rete non è raggiungibileLa struttura CSI non è disponibileNon ci sono semafori XENIX disponibiliNon ci sono indirizzi associati al nome dell'hostNon ci sono indirizzi associati al nomeManca l'anodeNon c'è spazio di buffer disponibileNon ci sono processi figliNon ci sono dati disponibiliNon c'è spazio per file sul serverNon ci sono lock disponibiliNessuna corrispondenzaNon è stato trovato un mediumNon ci sono messaggi del tipo desideratoNon ci sono altri record nel database della mappaManca una precedente espressione regolareNon ci sono lock di record disponibiliNessun programma remoto registrato. +-Non c'è una route verso l'hostNon è rimasto spazio sul dispositivoDispositivo inesistenteDispositivo o indirizzo inesistenteFile o directory inesistenteLa chiave non è nella mappaLa mappa non è nel dominio del serverProcesso inesistenteIncontrato un namespace non di NIS+Errore irreparabile nella risoluzione dei nomiNessuno. +-Non è un file con nome di XENIXNon è un messaggio di datiNon è una directoryNon è un file con nomeNon è un dispositivo streamNon disponibileNon c'è abbastanza spazioNon trovatoNon trovato, nome inesistenteNon è un server master per questo dominioNon è il proprietarioNon gestitoNumero di Colonne : %d +-Numero di oggetti : %u +-Il numero di link simbolici incontrati durante l'attraversamento del percorso eccede MAXSYMLINKSArgomento numerico fuori dal dominioRisultato numerico fuori scalaOggetto #%d: +-Nome dell'oggetto: %s +-Tipo dell'oggetto: L'oggetto è remotoEsiste un oggetto con lo stesso nomeNumero dispari di virgoletteSolo root puo` usare questa opzione!Operazione già in corsoOperazione cancellataOperazione non applicabileOperazione non permessaOperazione non gestitaOperazione non gestita dall'estremità del trasportoL'operazione ora è in corsoL'operazione si bloccherebbeOpzione non gestita dal protocolloRisorse degli streams esauriteRisorse degli streams esauriteControllo dell'output:Selezione dell'output:Proprietario : %s +-PRIVATO +-Pacchetto non installatoErrore di parsing: %sSuccesso parzialeL'oggetto passato non è lo stesso oggetto sul serverPermesso negatoManca la correnteFine prematura dell'espressione regolareStampa il contenuto del file del database, una voce per rigaStampa le statistiche della configurazione attualeStampa altri messaggiStampa la versione del programmaProbabile successoProbabilmente non trovatoTimer di profiling scadutoDriver del protocollo non collegatoErrore di protocolloFamiglia del protocollo non gestitaProtocollo non disponibileProtocollo non gestitoTipo di protocollo sbagliato per il socketQuery illecita per la tabella indicataQuitErrore specifico di RFSProcedura RPC non valida per il programmaErrore di RPC su una operazione NISProgramma RPC non disponibileVersione sbagliata del programma RPCLa struct RPC non è validaVersione di RPC sbagliataRPC: (codice di errore sconosciuto)RPC: Errore di autenticazioneRPC: Impossibile decodificare il risultatoRPC: Impossibile codificare gli argomentiRPC: Fallito (errore non specificato)RPC: Versioni di RPC incompatibiliRPC: Errore del portmapperRPC: Procedura non disponibileRPC: Programma non registratoRPC: Programma non disponibileRPC: Programma/versione non corrispondentiRPC: Errore del sistema remotoRPC: Il server non può decodificare gli argomentiRPC: SuccessoRPC: Tempo scadutoRPC: Impossibile ricevereRPC: Impossibile inviareRPC: Host sconosciutoRPC: Protocollo sconosciutoRSA (%d bit) +-RTLD_NEXT usato in codice non caricato dinamicamenteLegge e mostra i dati di profilazione degli oggetti condivisiLegge i dati di configurazione da NOMEFile system di sola letturaSegnale real-time %dEspressione regolare troppo grandeErrore di I/O remotoÈ cambiato l'indirizzo del remotoRimuovere 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 usando lo script `glibcbug'. +-Argomenti della richiesta non validiRiservato per usi futuriErrore 0 del resolver (nessun errore)Errore interno del resolverEvitato un deadlock sulle risorseRisorsa persaRisorsa temporaneamente non disponibileRisultato troppo grandeRisultati inviati alla procedura di callbackSHOBJ [PROFDATA]SUNYPPercorso di ricerca : %s +-Segmentation faultServer occupato, riprovareIl server ha esaurito la memoriaIl server ha rifiutato le credenzialiIl server ha rifiutato il verificatoreServname non gestito per ai_socktypeImposta il nome del programmaDisattiva il serverSegnale 0Operazione per socket su un non socketTipo di socket non gestitoIl programma ha causato la fine della connessioneSpiacente, non sei root +-Le definizioni sorgente sono nel FILEErrore di srmountStack faultVecchio file handle NFSLancia NUMERO threadStato : %s +-FermatoFermato (segnale)Fermato (input da tty)Fermato (output da tty)Errore di pipe di streamsLa struttura ha bisogno di essere pulitaSuccessoSopprime messaggi di avvertimento e informazioneNomi simbolici dei caratteri definiti in FILEErrore di sistemaInformazioni sul sistema:Errore di allocazione delle risorse di sistemaDirectory di sistema per le mappe dei caratteri: %s +- repertoire maps : %s +- percorso di localizzazione: %s +-%sTABELLATABELLA +-TABELLA,siTipo di tabella : %s +-Errore temporaneo durante la risoluzione del nomeTerminatoFile text occupatoLa 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 scadutoTroppi attributiTroppi livelli di link simboliciTroppi linkTroppi file apertiTroppi file aperti nel sistemaTroppi processiTroppi riferimenti: impossibile dividereTroppi utentiTrap di trace/breakpointBackslash finaleIl traduttore è mortoEstremità del trasporto già connessoEstremità del trasporto non connessoUsare `%s --help' o `%s --usage' per ulteriori informazioni. +-Proviamo %s... +-Tipo : %s +-SCONOSCIUTOImpossibile autenticare il client NIS+Impossibile autenticare il server NIS+Impossibile creare il callbackImpossibile creare il processo sul serverSconosciuto (tipo = %d, bit = %d) +-Parola chiave di .netrc sconosciuta %sCodice di errore di NIS sconosciutoDatabae sconosciuto: %s +-Errore sconosciutoErrore sconosciuto Host sconosciutoOggetto sconosciutoOpzione sconosciuta: %s %s %sErrore conosciuto del resolverErrore sconosciuto del serverSegnale %d sconosciutoErrore di sistema sconosciutoErrore sconosciuto di ypbind( o \( sbilanciato) o \) sbilanciato[ o [^ sbilanciato\{ sbilanciatoVariabile `%s' non riconosciutaCondizione di I/O urgenteUso:Uso: %s nome_variabile [percorso] +-Uso: rpcinfo [ -n numporta ] -u host numprog [ numvers ] +-Usa una cache separata per ogni utenteSegnale 1 definito dall'utenteSegnale 2 definito dall'utenteValore troppo grande per il tipo di dato definitoVirtual timer expiredRisultato assurdo dall'esecuzione del comandoFinestra cambiataScrive i nomi delle mappe di caratteri disponibiliScrive i nomi delle localizzazioni disponibiliScrive i nomi delle categorie selezionateScrive i nomi delle parole chiave selezionateScrive l'output nel file NOMEScritto da %s. +-Tipo di medium erratoX500XCHSYPBINDPROC_DOMAIN: %s +-Sì, 42 è il significato della vitaQuesta volta hai davvero combinato un pasticcioIl 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 sconosciutoai_family non gestitaai_socktype non gestitogià in esecuzionel'argomento di <%s> deve essere un unico caratterel'argomento di `%s' deve essere un unico carattereauth_none.c - Problema fatale di marshallingauthunix_create: memoria esaurita +-argomenti non validiproprietario non validocampo FROM vuoto in una riga di Linkcampo TO vuoto in una riga di Linkblocco 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 buffercache_set: impossibile allocare un nuovo rpc_buffercache_set: fallita l'allocazione della vittimacache_set: vittima non trovataimpossibile determinare l'abbreviazione del fuso orario +-da usare subito dopo il tempo finaleimpossibile riassegnare il numero di procedura %d +-impossibile fare `stat' sul file di localizzazione `%s'impossibile allocare i dati dei simboliimpossibile creare il descrittore internoimpossibile creare i descrittori interniimpossibile abilitare il socket ad accettare connessioni: %simpossibile trovare il preprocessore C: %s +-impossibile trovare un preprocessore C +-impossibile gestire una vecchia richiesta di versione %d; +-la versione attuale è %dimpossibile inserire l'elemento di collazione `%.*s'impossibile l'inserimento nella tabella dei risultatiimpossibile inserire la nuova definizione di simbolo di collazione: %simpossibile leggere i dati di profilazioneimpossibile aprireimpossibile aprire `%s'impossibile aprire il file del database `%s': %simpossibile aprire il file di input `%s'impossibile aprire il file di definizione della localizzazione `%s'impossibile aprire il file di outputimpossibile 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 ordineimpossibile leggere la directory delle mappe di caratteri `%s'impossibile leggere il file di configurazione. Questo è fataleimpossibile leggere dal clientimpossibile 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 statisticiimpossibile fare stat() sul file `%s': %simpossibile scrivere i file di output su `%s'impossibile scrivere i risultati: %simpossibile scrivere le statistiche: %simpossibile scrivere sul clientdati di categoria richiesti più di una volta: non dovrebbe succedereil carattere '%s' nella classe `%s' deve essere nella classe `%s'il carattere '%s' nella classe `%s' non deve essere nella classe `%s'carattere non definito nella mappa di caratteriil 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 predefinitoclasse di caratteri `%s' già definitamappa di caratteri `%s' già definitafile di mappa di caratteri `%s' non trovatoclnt_raw.c - Errore fatale di serializzazione dell'headerclnttcp_create: memoria esaurita +-clntudp_create: memoria esaurita +-clntunix_create: memoria esaurita +-l'elemento di collazione `%.*s' appare più di una volta: riga ignoratail simbolo di collazione `%.*s' appare più di una volta: riga ignoratasimbolo di collazione non trovato dopo `%s'connessione all'indirizzo %s: attesa una costante o un identificatoreconversione da `%s' a `%s' non gestitaconversione fermata a causa di un problema durante la scrittura dell'outputimpossibile creare un server rpc +-impossibile registrare il programma %d vers %d +-database [chiave ...]file di mappa di caratteri `%s' predefinito non trovatoil 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 caratterenome di carattere `%s' ripetutodefinizione di eleento di collazione ripetutadefinizione ripetuta per il carattere `%.*s'chiave ripetutadefinizione di insieme ripetutanome di zona %s duplicato (file "%s", riga %d)identificatore del messaggio doppionumero del messaggio doppiostringa di caratteri vuotanome del peso assente: riga ignorataenablecache: cache già abilitataenablecache: impossibile allocare la cacheenablecache: impossibile allocare i dati della cacheenablecache: impossibile allocare il fifo della cachecodifica per l'outputcodifica del testo originalepunto terminale dell'intervallo dei puntini maggiore dell'inizioerrore ottenendo l'id dei chiamanti: %serrore chiudendo l'input `%s'errore chiudendo il file di outputerrore chiudendo il file con i dati di profilazioneerrore di inserimento dell'elemento di collazione nellatabella hasherrore di inserimento nella tabella hasherrore leggendo l'outputmanca un argomento stringa per `copy'manca la riga di continuazioneimpossibile caricare l'oggetto condiviso `%s'impossibile caricare i dati dei simboliimpossibile fare mmap del file con i dati di profilazioneimpossibile iniziare il processo di conversioneerrore di scrittura dei dati per la categoria `%s'fcntl: F_SETFDil campo `%s' nella categoria `%s' non è definitoil file `%s' esiste già e potrebbe essere sovrascritto +-il valore di partenza di `collating-element' deve essere una stringafstat fallitospazzatura alla fine della specifica del codice di caratterespazzatura alla fine del numerospazzatura 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 chiamategenera un profilo piatto con totali e tickget_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 simbolicoha un hard link da qualche partecampo CORRECTION illecito in una riga Leapcampo Rolling/Stationary illecito in una riga Leapcostante carattere illecita nella stringacarattere illecito nel file: elemento di collazione illecitodefinizione illecitacodifica ottenuta illecitasequenza di escape illecita a fine stringasequenza di escape illecita alla posizione %ldnomi illeciti per l'intervallo di caratterinettype illecito:`%s' +-numero illecito per lo scostamento nella stringa %d, +-nel campo `era' della categoria `%s'numero dell'insieme illecitodata 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 caratterilimite di implementazione: permesse al piu` %d mappe di carattericarattere o sequenza di shift incompleti alla fine del bufferfile formattato non correttamentelinea di input di tipo sconosciutoerrore interno (descrittore illecito)errore interno - addtype chiamata con isdst erratoerrore interno - addtype chiamata con ttisgmt erratoerrore interno - addtype chiamata con ttisstd erratoerrore interno in %s, riga %uscostamento UTC non validoformato di abbreviazione non ammessogiorno del mese erratoanno finale erratoanno bisestile erratomodo di dlopen() non validonome del meso erratoorario salvato erratoanno iniziale erratoora del giorno erratagiorno della settimana erratolunghezza della chiave troppo lunga nella richiesta: %Zdla riga dopo i puntini deve contenere una definizione di caratterela riga prima dei puntini deve contenere una definizione di carattereriga troppo lungaelenca tutti i set di caratteri codificati notifile di localizzazione `%s', usato nell'istruzione `copy', non trovatolstat fallitoriga malformata ignoratafallita la mappatura della tabella delle stringhe degli header di sezionefallita la mappatura degli header di sezionememoria sovrascritta prima del blocco allocato +-memoria sovrascritta dopo la fine del blocco allocato +-memoria esauritala 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 anonimanon sono state specificate nè la codifica originale nè quella di destinazionenetname2user: (nis+ lookup): %s +-netname2user: la voce DES di %s nella directory %s non è unicanetname2user: la voce LOCAL di %s nella directory %s non è unicanetname2user: manca la lista dei group id in `%s'.netname2user: nome principale `%s' troppo lungonetname2user: non deve avere uid 0il programma %d non è mai stato registrato +-non è stato dato un valore tipo o nessuna espressione regolare corretta per il campo `%s' +-della categoria `%s': %snessun giorno del mese corrisponde alla regolanessuna definizione di `UNDEFINED'non è stato indicato il nome del file per i dati di profilazione e l'oggetto +-condiviso `%s' non ha un sonamenessun'altra parola chiave va specificata quando si usa `copy'nessun file di uscita prodotto a causa degli avvertimentinon è stata indicata la repertoire map: impossibile procederenessun nome simbolico fornitonessun nome simbolico fornito per la fine dell'intervallonessun peso definito per il simbolo `%s'non è un file regolareconfigurazione di nscd: +- +-%15d livello di debug del server +-nscd non è in esecuzione! +-una definizione CHARMAP può essere seguita solo da definizioni WIDTHnon è stata specificata con `-f' la codifica originalefile di outputproblema rpc di pmap_getmapspoll: problema di protocollo impostando il circuito +-errore del preprocessorestampa la lista dei count path e il loro numero d'usostampa informazioni sui progressiproblemi 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 ripetutorepertoire map file `%s' non trovatorpcgen: 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 portmapperstesso nome di regola in più filelettura troppo corta leggendo la chiave di richiesta: %slettura troppo corta leggendo la richiesta: %sscrittura troppo corta in %s: %ssocket: problema di protocollo impostando il circuito +-gli ordinamenti `forward' e `backward' sono mutuamente esclusivinon ha senso specificare pesi di ordinamento per il simbolo di collazionestandard inputstandard outputdata iniziale illecita nella stringa %d, +-nel campo `era' della categoria `%s'anno iniziale maggiore dell'anno finaleanno iniziale troppo grande per essere rappresentatoanno iniziale troppo piccolo per essere rappresentatola data di stop non è permessa nella stringa %d in campo `era' della +-categoria `%s'svc_run: - select fallitasvc_tcp.c - impossibile fare getsockname o listensvc_tcp.c - problema di creazione del socket tcpsvc_tcp: makefd_xprt: memoria esaurita +-svc_unix.c - problema di creazione del socket AF_UNIXsvc_unix.c - impossibile fare getsockname o listensvc_unix: makefd_xprt: memoria esaurita +-svctcp_create: memoria esaurita +-svcudp_create - impossibile fare getsocknamesvcudp_create: memoria esaurita +-svcudp_create: problema di creazione del socketsvcunix_create: memoria esaurita +-il simbolo per l'elemento di collazione multicarattere `%.*s' +-replica la definizione dell'elementoil simbolo per l'elemento di collazione multicarattere `%.*s' +-replica la definizione di un altro simboloil simbolo per l'elemento di collazione multicarattere `%.*s' +-replica la definizione del simboloil simbolo per l'elemento di collazione multicarattere `%.*s' +-replica il nome simbolicoerrore di sintassi nella definizione di %s: %serrore di sintassi nella direttiva `order_start'errore di sintassi nella definizione della classe del carattereerrore di sintassi nella definizione della conversione del carattereerrore di sintassi nella definizione dell'ordine di collazioneerrore di sintassi nella definizione della collazioneerrore di sintassi nella categoria di LC_TYPEerrore di sintassi nella definizione di una nuova classe di caratterierrore di sintassi nella definizione di una nuova mappa di caratterierrore di sintassi nella definizione dalla localizzazione del messaggioerrore di sintassi nella definizione dalla localizzazione monetariaerrore di sintassi nella definizione dalla localizzazione numericaerrore di sintassi nella specifica di ordinamentoerrore di sintassi nel prologo: %serrore di sintassi nella definizione della repertoire map: %serrore di sintassi nella definizione della localizzazione del tempoerrore di sintassi: fuori da una sezione di definizione di localizzazionenon è stata specificata con `-t' la codifica di destinazionequesta è la prima definizionetempo precedente a zerooverflow del tempotroppo pochi byte nella codifica di caratteretroppi byte nella codifica di caratteredefinite troppe classi di caratteretroppi secondi intercalaritroppi tipi di tempi localitroppe transizioni?!troppi pesitroppe o troppo lunghe abbreviazioni di fuso orariospazzatura alla fine della rigaproblema rispondendo al programma %d +-non sono permesse due righe di seguito contenenti `...'digitato un solo annoimpossibile allocare il buffer per l'inputimpossibile liberare gli argomentinon definitocarattere sconosciuto `%s'carattere sconosciuto nel campo `%s' della categoria `%s'direttiva di collazione sconosciutadirettiva `%s' sconosciuta: riga ignorataerrore di iconv() sconosciuto %dinsieme `%s' sconosciutosimbolo `%.*s' sconosciuto: riga ignoratazona senza regolemessaggio non terminatostringa non terminatacostante stringa non terminatanome simbolico non terminatonome di peso non terminatolimite superiore dell'intervallo non minore del limite inferioreuso: %s infile +-uso del 29/2 in anno non bisestileil valore di %s deve essere interoil valore di <%s> deve essere compreso fra 1 e 4il valore per il campo `%s' della categoria `%s' +-non deve essere la stringa vuotail valore di deve essere maggiore del valore di il valore del campo `int_curr_symbol' della categoria `LC_MONETARY' +-non corriposnde ad un nome ISO 4217 validoil valore del campo `int_curr_symbol' della categoria `LC_MONETARY' +-è di lunghezza erratai valori dei campi `%s' della categoria `%s' devono essere +-inferiori a 127attenzione: accettando la connessione: %sallocando la voce di cacheallocando voce della tabella hashallocando la copia della chiaveaprendo il file del vecchio catalogopreparando l'outputleggendo il databasefacendo stat del database di profilazionescrivendo il file del databasewrite incompletascrivibile da altri oltre il proprietarionumero di argomenti sbagliatonumero di campi errato su una riga Leapnumero di campi errato su una riga Linknumero di campi errato su una riga Rulenumero di campi errato su una riga Zone di continuazionenumero di campi errato su una riga Zonexdr_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ôKMLEUL&›L(ÂLëLüLM&M5MIMdM~Mn’MOO"%O"HOkO:‡OÂOËOÔOêOPP2PLPePPšP¶PÐPíPQ#Q*Q EQRQYQ3kQ3ŸQ4ÓQ.R%7R]R&qR%˜R¾R%ÕR3ûR,/S)\S†S"ŸS!ÂSäSûST.TDT"ZT*}T¨T&ÂT&éT&U&7U&^U…U U$¾UãUþUV,2V_V%}V,£V-ÐV þV&WFWeW„WžW²WÒW‰òW2|X¯X"ÊX4íX"Y#4Y XY=bY Y<±YîY'Z6Z)?Z(iZ ’Z³ZµZ½Z$ÎZóZ) +-[(4[][ m[y[#[/´[ä[ö[ \ \%\9\ N\Z\j\\ ›\¨\¾\ Õ\ á\ë\ï\ ]&]-<]!j]Œ]ª]È]ß]&ÿ]%&^0L^!}^Ÿ^-·^å^%_)(_'R_%z_& _Ç_ã_ ý_ +-`%`<`X`u`@Ž`DÏ`a'a@a Ua=_aaÇ·ab7žb2Öb- c7c$Jc +-oczc€c!„c¦c·cÐcícdd/dJd^drd3†d-ºd2ède,e5e;jzjƒj‡jšj!®j Ðj!Ýjÿj.kMk ak nk"{kžk±kÄk Úkäk+ük(lElVlmlŠl¤l¼lØlðl +-m1m$Mmrm„mŸm´mÏm çmômn +-n#n*n20ncnrn‹n šn¨nÄnÚnón oo!3oUosos“op*pCp]pnppžp±pÅpÝpópq qq9qVqnq„q,q +-ÊqÕq Üqéqr#r>rXrprr#¢rÆrÖrírs#&sJsjssss s²sÊsÝsæsöst1tPtptt™t¨tÂtÕtôtu*#uNuUumu‰u ™u!£u ÅuÏuéu v"v @vMvavrvƒv v(¾vçvww5wOwew~wŽw w´w½wÓwãw.ów"x 4x#Bx0fx%—x½xÑxçxøx y#y@yOymy„y›yºyØyÝyðyz+zEz_zqzƒzz·zÐzìz! {.{G{b{~{—{µ{"Î{ ñ{þ{ |$|8|J|`|-o|-|!Ë|í|}}2}C}2Z}#} ±}¾};Ò}~$~@~X~ r~ €~¡~¿~Ð~Ö~ð~/J&cŠŸ´½Ü ö€$0€ U€ c€o€…€š€²€º€Ë€߀ô€ *((S |‰"ƒÀD‚K‚$e‚ +-Š‚•‚«¤‚P„ `„n„!‚„¤„³„Ç„å„"ø„…*…@…S…'c…#‹…6¯… æ… +-ô…ÿ…"†"*†M†"g†Š†ª†ĆÛ† ñ†ÿ† ‡‡*‡C‡Z‡o‡‡–‡«‡½‡χ á‡î‡ ˆˆ#%ˆ:Iˆ„ˆšˆ%°ˆÖˆ"숉!‰ @‰"a‰ „‰¥‰¿‰ωá‰æ‰ë‰Š!ŠF>Š …Š.Š-¾Š6ìŠ8#‹;\‹I˜‹â‹ú‹Œ+$Œ+PŒ'|Œ¤Œ ÄŒ ьیùŒ&(.O&~¥,µâŽCŽ#aŽ…Ž¤Ž!ÀŽ"âŽ. 4%U;{&·Þ1þ0 KW"h‹'§Ïç.‘3‘"J‘(m‘-–‘Ä‘Ü‘!ù‘’8’X’t’!’²’Ê’æ’9ý’47“8l“+¥“8Ñ“$ +-”"/”!R”.t”£””á”<•;>•$z•Ÿ•·•*ו7–:–"Y–|–)–N¹–U—^—&|—)£— Í—Û—+ô— ˜>˜X˜j˜"Š˜%­˜*Ó˜*þ˜)™=™0W™ˆ™§™+Ç™7ó™#+šOš!mš$š!´šÖš&ñš%›,>›k›'z›%¢›0È›2ù› ,œ.9œhœKœLÍœLg+{2§2Ú/ ž$=žbž%xž-žž$Ìžñž Ÿ'Ÿ:Ÿ(QŸ&zŸ!¡ŸßFÚŸ! B4 Bw ?º <ú 77¡o¡Š¡#¥¡.É¡0ø¡0)¢Z¢x¢‹¢§¢¼¢Тå¢ÿ¢£%£;£O£#d£5ˆ£G¾£ ¤#¤58¤ n¤{¤-’¤!À¤(â¤- ¥9¥J¥'\¥?„¥=Ä¥ ¦.¦ ?¦9`¦;š¦,Ö¦*§#.§R§%l§A’§Ô§ñ§I¨7X¨3¨+Ĩð¨'©!/©Q©.b©‘©C¤©*è© ªª(8ªaª1tª¦ªÁª:ݪ«)6«*`«#‹«¯«$Ï«ô«¬",¬O¬m¬‡¬¤¬>Ĭ­!"­ D­(e­$Ž­³­*É­=ô­H2®{®Š®Eš®&à®(¯'0¯EX¯ž¯(·¯'à¯$°,-°)Z°%„°ª°"È°ë°& ±0±PO±V ±U÷±OM²V²!ô²'³*>³/i³*™³$ij/é³1´/K´){´*¥´)д#ú´µ-9µ&gµ4Žµ(õìµ ¶ ¶#(¶$L¶"q¶”¶ª¶ĶÛ¶.춷;·3X·Œ·#ž·· Û·å·0ü·-¸$I¸n¸‡¸#˜¸ ¼¸ȸݸñ¸¹)¹4B¹w¹Š¹§¹'ǹBï¹D2ºjwºKâº?.»n»»!ª»Ì»æ»¼¼"3¼V¼r¼ƒ¼¡¼#»¼#ß¼#½0'½#X½|½š½*¸½%ã½' ¾1¿D¿GW¿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Ù1SÙ …Ù“Ù;¢Ù@ÞÙÚ 9ÚZÚlڄڜڴÚÇÚàÚ&ñÚÛ/Û5ÛoUÛÅÛÖÛóÛÜ +Ü9Ü MÜ [Ü|Ü›Ü(¢Ü(ËÜ(ôÜ*Ý(HÝqÝ…Ý ›Ý7§ÝßÝèÝ ìÝ úÝ Þ )Þ5ÞRÞmÞ ‹Þ•Þ +-›Þ¦Þ¹Þ ÈÞÖÞçÞðÞ(ß,ß HßVßi߃ߡ߼ßÏßíß à/à@àWàhàxà‹àžà ³àÁàÐà +-æàñàøà@þà ?áMá fá tá€áá³áËá +-ãáîáâ""âEâpaâ +-Òâ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ë3së§ë¿ëÓë æë òë!þë ì <ì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õciõÍöÞöñö÷÷0÷F÷e÷$z÷Ÿ÷²÷Ã÷Õ÷&å÷& ø>3ø rø +-€ø‹ø ”øµøÐø äø"ù(ùDù]ù|ùŒùœù®ùÂùÜùóùúú2úIúbú{ú”ú¦ú¿úÒúÚúDöú;ûNû#aû…û'›û Ãû&Ñû"øû ü<üZüoüƒü–ü›ü ü'·üßüNüü Ký*Uý2€ý:³ý2îý@!þ6bþ™þ·þ ×þ'ãþ' ÿ-3ÿaÿ ÿ ‹ÿ™ÿ´ÿÍÿ3ãÿ')? i-w#¥ÉCé(-'V ~ Ÿ À-á#)3>]*œÇ2ã$;J+`Œ&¬Óî0?Z*y&¤Ë ë' !4*V& %Çí!F=D„GÉ)/;"k Ž!¯'Ñù3BQB”(×  *, 7W  )¬ Ö &ë R +-Te +-º +-#Ò +-ö +-   #+ O d  w " (¤ &Í +ô +  L X (g  ° ,Ð ,ý %* P "m   ¯ Ð )ë '0X1g1™2Ë6þ +-5(@iSˆVÜV3Š+-É,÷)$(Nw Œ(­ Ö÷&8+O${ ºBÑ@+@l:­9è*"Me~+˜-Ä-ò ;Od| ‘Ÿ¶ÉÞõ +--=7k£ ´9Õ +-+9e%‚*¨Óã2ô='=e £0±âGII/“&Ã(ê13/e!•·HÑ3:N3‰½"Ô-÷%#6Z4w)¬ Öà"ö +'S d?…!Å*ç3F!f ˆ©Ã%Ü&5&\7ƒ!»&Ý# ( G e $} 4¢ @×  ! "!N,!"{!/ž!/Î!Jþ!I"*`"‹""ª"#Í"+ñ"##A#"]#€#œ#º#C×#H$Hd$C­$Gñ$9%%X%!~% %À%Û%'ö%#&(B&%k&#‘&#µ&Ù&ò&" '#,'&P')w'¡' º' È''Ö''þ'"&(I(Z(t(…(–(#¶(&Ú(,).)%M)s) ‹)™)6®)å)!*#*>*!S* u*ƒ*˜*­*Ç*ß*)ù*#+9+R++q+7+5Õ+V ,Db,2§,Ú, õ,#-:-R-o-„-"-À-ß-#ö-."3."V."y./œ."Ì.ï. /2'/(Z/ÙkÝß@,Œ(Èø:CØ÷p}Õë2ÑëkD†!aSqäJw7ºý@„EVH¿sèlsŠu[¢vË©á: ã6=u‚ño.£ |dãpÔ9™$–[¥l?úC`ŒŒ‡*€X9IÊSVp!Ò…ydá‡þ£בQò1õÂn^ +- m4·¨?îm³rŠþ]„ý‚Ì#´/_JÄœsfQ8årÍz•ƒ<ÖxB{Kˆå>÷DM¢œùÓ>·ÇoiÃ@xµûb ¶ga„Eoe-xWØ؃ZsR"ˆ4/îÁ*Û(äÇ…1 kLVÌN)²‰Ay¹*íf$XQ)#K¤ûÕ[qDáè½TaÄ.ÜùT,'ûu\àê!3ë‹g +-=H]Ó-5Oz»ßj«¬Ú ƒõôïí¿®Á”.¯ø†G’jJZ„R™›C¯3ÿÆ%e`«Ô¡ÉUm{QcP˜«¾òÀƺ6rÍ`ÿ³tôe5‹Fh|›§ìbܱ²ÈeÙ\~2E j¼#š þmÅy ¶1Mö\»4fR ¨×7YŠfL˜FΠª ‰<È¥  Ú’³{iYÏãç÷ %ÿ§(cŽÒ~,Ÿ{é‚ ñC5"Ñ?Ðv)…? +-+/~_"}W|ÛÉdµ¡O"=™R¤Lݽ@uÄ7^ý®8P‡Ãªy` <w}_¨'HdÑnš®ïH”GŽ5>+SÕ-Ý­Yú!©¾Iõgl¼^zßÒvžÞ¹öͤNA|ôtWÏ·+ðƒ$3h̪cèŒb&A´ib[ ¦8Û“ÞOàÔo×Y#róN0——í;n°Ü%‚ñó¼Ëžð E K +-M꿬âh¬XTt ¾^ü9‹M J”âµ>+Š(ì2c±‘6&£œV)†ü›¡¦úU=B•“º;véÊì0Ë€ZüÊï%ɯâ½~]ಘð1¶Np2i':0-DÅ°¸S­ÚÖWL8Óꦟî}¹ç,ø°¸Ðtäö&‘Bw†ælÏIæó‹å6'“ÎçUÙ‰À:*øF‰»– n.…q7éx/Þw;ŸÇž’À&§´G;TZF©g4ˆqò_OKP\–Æ—X•IzÅÂÁ‡G0aAˆBæjUù­€€š<$Ðk¥¢ÎÖ]PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Korean +-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 °³ÀÇ Ä³½¬ »ç¿ëÁß +-%15Zd ¸¸Å­ÀÇ ÃøÁ¤µÈ Å©±â +-%15ld Ãʵ¿¾È positive entry À¯Áö +-%15ld Ãʵ¿¾È negative entry À¯Áö +-%15ld ¹ø positive entriy¿¡ ´ëÇØ Ä³½¬ È÷Æ® +-%15ld ¹ø negative entriy¿¡ ´ëÇØ Ä³½¬ È÷Æ® +-%15ld ¹ø positive entriy¿¡ ´ëÇØ Ä³½¬ ¹Ì½º +-%15ld ¹ø negative entriy¿¡ ´ëÇØ Ä³½¬ ¹Ì½º +-%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: ´Â º¸´Ù Ä¿¾ß ÇÕ´Ï´Ù +-%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> ¹®ÀÚ´Â `%s' Ŭ·¡½º¿¡ ÀÖÀ¸¸é ¾ÈµË´Ï´Ù ¹®ÀÚ´Â `%s' Ŭ·¡½º¿¡ ¾øÀ½?ÁßÁöµÊÁ¢±Ù ±ÇÇÑ : ¼Õ»óµÈ °øÀ¯ ¶óÀ̺귯¸®¿¡ Á¢±ÙÇÔÁÖ¼Ò°¡ ÀÌ¹Ì »ç¿ë ÁßÀÔ´Ï´ÙÈ£½ºÆ®À̸§¿¡ ´ëÇÑ ÁÖ¼Ò±ºÀÌ Áö¿øµÇÁö ¾ÊÀ½ÁÖ¼Ò±ºÀÌ ±Ô¾à¿¡¼­ Áö¿øµÇÁö ¾ÊÀ½±¤°í ¿À·ùÀÚ¸íÁ¾ ½Ã°èÀμö ¸í´ÜÀÌ ³Ê¹« ±é´Ï´Ùºñ¾îÀÖÁö ¾ÊÀº Å×À̺íÀ» Áö¿ì·Á°í ½Ãµµ³Ê¹« ¸¹Àº µ¿Àû ¶óÀ̺귯¸®¿Í ¸µÅ©ÇÏ·Á°í ½ÃµµÇÏ¿´À½ÀÎÁõ ¼º°øÀÎÁõ ¿À·ù¾ûÅ͸® ¿ÀºêÁ§Æ® +-À߸øµÈ ÁÖ¼ÒÀ߸øµÈ ÆÄÀÏ ±â¼úÀÚÀ߸øµÈ ÆùÆ® ÆÄÀÏ Çü½ÄÀ߸øµÈ ¸Þ½ÃÁöÀ߸øµÈ ½Ã½ºÅÛ È£ÃâÀ߸øµÈ ai_flagsÀÇ °ª¾ö°ÝÇÏ°Ô POSIX¸¦ µû¸§ÀÌÁø µ¥ÀÌŸ +-ºí·° ÀåÄ¡°¡ ÇÊ¿äÇÔºê·Îµåij½ºÆ® ¼±Åà ¹®Á¦ÆÄÀÌÇÁ°¡ ±ú¾îÁü¹ö½º ¿À·ùCDSCPU ½Ã°£ Á¦ÇÑ ÃÊ°úÇÔ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°¡ À¯ÀÏÇÏÁö ¾Ê½À´Ï´Ù +-µð·ºÅ丮 +-DNANSDNSÅ×ÀÌºí¿¡ ´ëÇÑ µ¥ÀÌŸº£À̽º°¡ ¾ø½À´Ï´Ùµ¥ÀÌÅͺ£À̽º°¡ ÀÛ¾÷ ÁßÀԴϴٱ⺻ Á¢±Ù ±ÇÇÑ : +-¸ñÀûÁö ÁÖ¼Ò°¡ ÇÊ¿äÇÔÀåÄ¡°¡ ½ºÆ®¸²ÀÌ ¾Æ´ÔÀåÄ¡°¡ ¼³Á¤µÇÁö ¾Ê¾ÒÀ½ÀåÄ¡³ª ÀÚ¿øÀÌ µ¿ÀÛ Áß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]NISNIS Ŭ¶óÀ̾ðÆ®/¼­¹ö ¹öÀü ºÒÀÏÄ¡ - ¼­ºñ½º¸¦ Á¦°øÇÒ ¼ö ¾ø½À´Ï´Ù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' ½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇØ ¿¡ º¸°íÇϽʽÿÀ. +-¿äûµÈ Àμö°¡ À߸øµÊÇØ°á±â ¿À·ù 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ÀÌ ¸¸µé¾ú½À´Ï´Ù. +-À߸øµÈ ¸Å°³Ã¼ ŸÀÔX500XCHSYPBINDPROC_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'ÇÒ ¼ö ¾ø½À´Ï´Ù±âÈ£ µ¥ÀÌŸ¸¦ ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù³»ºÎÀû ±â¼úÀÚ¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù³»ºÎÀû ±â¼úÀÚ¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù¼ÒÄÏÀÌ ¿¬°áÀ» ¹Þ¾ÆµéÀ̵µ·Ï ÇÒ ¼ö ¾ø½À´Ï´Ù: %sC Àü󸮱⸦ ãÀ» ¼ö ¾ø½À´Ï´Ù: %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' Ŭ·¡½º¿¡ µé¾î ÀÖÀ¸¸é ¾È µË´Ï´Ù¹®ÀÚ °¡ ¹®ÀÚ Áöµµ¿¡¼­ Á¤ÀǵÇÁö ¾Ê¾ÒÀ½¹®ÀÚ `%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 +- ȤÀº °ªÀÌ ÁÖ¾îÁöÁö ¾Ê¾Ò½À´Ï´Ù`%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¸¦ ´Ù ¾²Áö ¸øÇßÀ½: %ssocket: ȸ·Î ¼³Á¤Áß ±Ô¾àÀÌ ºÒÀÌÇàµÊ +-Á¤·Ä ¼ø¼­ `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' ÇʵåÀÇ °ªÀº ºó ¹®ÀÚ¿­ÀÌ µÇ¸é ¾È µË´Ï´ÙÀÇ °ªÀº ÀÇ °ªº¸´Ù Ä¿¾ß ÇÕ´Ï´Ù`LC_MONETARY' ¹üÁÖÀÇ `int_curr_symbol' ÇʵåÀÇ °ªÀÌ ISO 4217¿¡ Çã¿ëµÇ´Â À̸§ÀÌ ¾Æ´Õ´Ï´Ù`LC_MONETARY' ¹üÁÖÀÇ `int_curr_symbol' ÇʵåÀÇ °ªÀÇ ±æÀÌ°¡ Ʋ·È½À´Ï´Ù`%s' ¹üÁÖÀÇ `%s' ÇʵåÀÇ °ªÀº 127º¸´Ù ÀÛ¾Æ¾ß ÇÕ´Ï´Ù¿¬°áÀ» ¹Þ¾ÆµéÀÌ´Â µµÁß: %sij½¬¿¡ ³ÖÀ» Ç׸ñÀ» ÇÒ´çÇÏ´Â µµÁßÇؽ¬ Å×ÀÌºí¿¡ 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 @@ +-Þ•Jl¼$1" 1",1O1:k1¦1Ä1ß1æ13ø13,2`2&t2%›2Á2%Ø23þ223"K3!n33§3À3Ú3ð3"4*)4T4&n4&•4&¼4&ã4& +-5$15V5q5‹5,¥5Ò5%ð5,6-C6 q6&’6¹6Ø6ò67‰272¼7#ï7 88.8'N8v8(8 ¨8É8Ë8$Ó8ø8(989 H9T9/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 AA2A FA!SAuA.”AÃA×AêAýA BB+5BaBrB‰B¦BÀBØBôB C&C17C$iCŽC C»CÐCëC DDD4D;DJDcD rD€D–D¯D!ÉDëD EE+E9>ExE‘E¬E#¿EãEóE +-F%FCFcFlF†F™F«F¾FÇF×FòFG1GQGbGzG”G§GÆGÖGòG H#HAHRHpHŽH¦H!¾HàHúHI)I?I QI#_IƒI›I¸IÇIåIüIJ2J7JJJhJ…JŸJ¹JËJÝJ÷JK*KFK!fKˆK¡K¼KØKñKL"(L KLXLgL~L’L¤L-ºLèLþLM*M2AM;tM°MÆMâMúM N "NCNVNqNŠN“N²N ÌN íN ûNOO%O6OJO_OrO‹O"“O +-¶OÁO ÐO!ÞOPP#PAP"TPwP†P•P«P¾P'ÎP#öP&Q AQOQiQ€Q QœQ³QÈQÚQïQRR(R :RGRbRWwRVÏT·&W¼ÞY#›[:¿[ú[\%&\L\"b\…\”\¤\¶\Í\Fê\.1]6`]8—];Ð]I ^+V^+‚^'®^ Ö^ ã^í^ _'_%9_.__&Ž_µ_CÑ_#`9`&X``1Ÿ` Ñ`"Ý`a'aDa.aa"a(³a!Üaþa!b9=b4wb8¬b+åb8c$Jc"oc!’c.´c<ãc; d$\dd™d"¸d)ÛdNeUTeªe&Èe)ïe f'f+@flfŠf¤f"Äf%çf* g*8g0cg7”g#Ìg!ðg$h,7hdh'sh%›h2Áh ôh.i0iKIiL•iLâi2/jbj%xj-žj$Ìjñj kk(5k!^kF€kÇkBÚkBl?`l< lÝløl.m0Bm0sm¤mÂmÕmñmnn/nBnUnknn5”nGÊn o5 o Voco'zo,¢oÏoào&òo?p=Yp —p¥pA¿pqq7;q3sq§q'¾q!æqrCr]ryr)—r*Ár%ìrs$2sWssss¬s>Ìs t!*t#Lt pt*‘t*¼t=çtH%unu}uEu&Óu(úu'#vEKv‘v$ªv(Ïv'øv w">w&awPˆwVÙwU0xO†xVÖx!-y'Oy*wy/¢y*Òy$ýy/"z1Rz/„z)´z*Þz) {#3{W{&r{4™{Î{ë{ ü{# +-|$.|"S|v|Œ|¦|½|.Î|ý|}3:}n} €}Š}0¡}Ò}$î}~#$~ H~T~i~}~˜~4±~æ~'#BKDŽjÓK>€?Š€7Ê€9Pgƒ¡#»#ß#‚0'‚#X‚*|‚%§‚'Í‚0õƒ/&„V„Kr„¾„ Ü„ý„…+…+D…p…%……%«…Ñ…,ê…3†K†!i†$‹†°† ̆í† +-‡!‡(<‡?e‡¥‡"À‡"ã‡"ˆ")ˆ"Lˆ(oˆ˜ˆ²ˆ̈)戉$-‰)R‰*|‰"§‰%ʉ"ð‰Š3ŠOŠ–kŠ6‹#9‹ +-]‹h‹z‹.•‹ Ä‹2Ћ)Œ-Œ +-/Œ.:ŒiŒ,€Œ­Œ ¼ŒÆŒ,ጠ2@"]€‘©¾×èñ? Ž3MŽ$Ž ¦Ž ÇŽèŽ"'(3P(„­/É ù,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œ-†œ´œÍœêœ! BRr"{#žÂØ÷ž/ž(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 ½Bc½&¦½ ͽî½, ¾.9¾Qh¾Sº¾¿%¿#D¿h¿x¿,¿!º¿Ü¿"ñ¿!À%6À*\À*‡À4²À9çÀ'!Á$IÁ'nÁ.–ÁÅÁ.ÔÁ*Â7. fÂ1sÂ¥ÂOÅÂFÃL\Ã5©ÃßÃ,õÃ2"Ä"UÄxĘĬÄ/ÇÄ÷ÄHÅ`ÅAtÅA¶Å=øÅ=6ÆtÆ‘Æ9°Æ;êÆ;&ÇbÇÇ“Ç­ÇÈÇåÇüÇÈ'ÈFÈ`È3{È8¯È èÈ@öÈ 7ÉDÉ8^É:—ÉÒÉñÉ,ÊB>Ê@ÊÂÊ!ÑÊDóÊ38ËlËL‹Ë>ØËÌ.5Ì+dÌÌ?¤ÌäÌ"Í-$Í(RÍ({Í$¤Í&ÉÍ,ðÍ!Î?Î!^ÎF€Î ÇÎ0èÎ2Ï'LÏ,tÏ-¡Ï;ÏÏD ÐPÐ`ÐBqÐ!´Ð.ÖÐ-Ñ@3ÑtÑ)ŽÑ1¸Ñ'êÑ.Ò'AÒ&iÒTÒ\åÒ[BÓTžÓbóÓ%VÔ,|Ô*©Ô-ÔÔ1Õ,4Õ4aÕ5–Õ4ÌÕ-Ö//Ö/_Ö*ÖºÖ*ÚÖ4×:× U× c×#q×!•×$·×Ü×ö×Ø%Ø*7Ø!bØ(„Ø<­ØêØÙÙ0)Ù!ZÙ1|Ù®Ù(ÁÙêÙùÙÚ#.ÚRÚ=qÚ-¯Ú$ÝÚ*ÛA-ÛGoÛq·ÛX)ÜE‚Ü=ÈÜÝÝ>Ý[ÝnÝ,ŒÝ¹Ý'ÓÝ%ûÝ%!Þ/GÞ%wÞ/Þ,ÍÞnç9S1“È)´qp1Í/c­"Ldf0¡‡¸ +-‹ˆ‘—̓ Ä<ÿ¨ÛI;õ(YUÇA£ý'Æ- HFzóoÇ'ÌanHîCFϺmj_>Ûà,gÊ·.çéòBÝ60i?ñM43´s¹ ÐåÕÉP®Eï`üÜëGI-lì½:ÑA=#[±äû+ ×öߣ¥×þ*ä ;kuÚF>ñ pè…‡¿@"Qª7t ¡?œ=*¬VBÿvfúôËEH7‚-ð7‚Þ23íº·9W3?°âî.rd÷¯$ùm%ÕuK³%¤\DtO÷GߊXJZ@꾩 8®”§5.rŒqü=2­y§:Ü[ì4’/Àþ…œ{cQ`z+hɦ¼^ûà“Ás¶h¤RJÓÒS&Cø‰U:>€"€Ò²(|Kž ÁæÖÈiËÞx~ãJ –!,ÔT¦˜Š5¯e !aôb‹Ã ,„³j‘¢YPL• ÂÌŸõò—šÊ–©DNãCØ&<l}ĹIê/»ÔÖ6_°1á2*D6 XµæÎ+™•]»8~TÅ(Gw„Ú]WVÓáA”OðÝøé課¼å’ˆ†â)R4Ù¬gkŒ¢'Øv™Z¾ŽÀÅš«y †\#ž@Ÿ8#N^Ï;¥¸ ëóЫxM{±ÉÙoÎ0<}$í¨E9ù|µÆ›5w$ !Ž +-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: must be greater than +-%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 = character must not be in class `%s' character not in class `%s'?AbortedAccessing a corrupted shared libraryAddress already in useAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempting to link in too many shared librariesAuthentication OKAuthentication errorBad addressBad file descriptorBad font file formatBad messageBad system callBlock device requiredBroadcast select problemBroken pipeBus errorCPU time limit exceededCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTChannel number out of rangeChild exitedClient credential too weakCommunication error on sendComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedCopyright (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 exceededDatabase is busyDestination address requiredDevice not a streamDevice not configuredDevice or resource busyDirectory not emptyDisc quota exceededDomain not boundEMT trapError %dError in unknown error system: Error: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'Failed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFilesize limit exceededFloating point exceptionFunction not implementedGratuitous errorHangupHost is downHost name lookup failureI/O possibleIOT trapIdentifier removedIllegal InstructionIllegal instructionIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInput/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKilledLevel 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink has been severedLink number out of rangeLocal domain name not setLocal resource allocation failureMachine is not on the networkMemory exhaustedMessage too longMultihop attemptedNIS client/server version mismatch - can't supply serviceNIS map data base is badName not unique on networkNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databankNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNot a XENIX named type fileNot a directoryNumerical argument out of domainNumerical result out of rangeObject is remoteOdd number of quotation marksOperation already in progressOperation not permittedOperation not supportedOperation not supported by deviceOperation now in progressOperation would blockOut of streams resourcesPackage not installedPermission deniedPower failurePremature end of regular expressionProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRTLD_NEXT used in code not dynamically loadedRead-only file systemRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableSegmentation faultServer rejected credentialServer rejected verifierSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSrmount errorStack faultStale NFS file handleStoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSystem resource allocation failureTerminatedText file busyTimer expiredToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/BPT trapTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' for more information. +-Trying %s... +-Unknown .netrc keyword %sUnknown NIS error codeUnknown error Unknown hostUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage: %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 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWritten by %s. +-Wrong medium typeYPBINDPROC_DOMAIN: %s +-You really blew it this timeZone 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 characterargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problembad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twicebogus mcheck_status, library is buggybroadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)cache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot opencannot open databank file `%s': %scannot 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 specificationcannot 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 happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_raw.c - Fatal header serialization error.collation element `%.*s' appears more than once: ignore linecollation symbol `%.*s' appears more than once: ignore linecollation 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 founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoend point of ellipsis range is bigger then starterror while inserting collation element into hash tableerror while inserting to hash tableexpect string argument for `copy'expected continuation line not foundfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfrom-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal names for character rangeillegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincorrectly formatted fileinput line of unknown typeinternal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid GMT offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday nameline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmemory clobbered before allocated blockmemory clobbered past end of allocated blockmemory exhaustedmemory exhausted +-memory is consistent, library is buggymissing era format in string %d in `era' field in category `%s'missing era name in string %d in `era' field in category `%s'nameless rulenever registered prog %d +-no correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular fileonly WIDTH definitions are allowed to follow the CHARMAP definitionproblems 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 momentrpcinfo: %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 portmapperrpcinfo: can't contact portmapper: same rule name in multiple filesselect: protocol failure in circuit setup +-socket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp: makefd_xprt: out of memory +-svctcp_.c - cannot getsockname or listensvctcp_.c - udp socket creation problemsvctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: socket creation problemsymbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectionthis is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limituse of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127values for field `%s' in category `%s' must not be zerowhile opening UTMP filewhile opening old catalog filewhile preparing outputwhile reading databankwhile writing databank filewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone lineyp_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 +-Language-Team: Dutch +-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: moet groter zijn dan +-%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 = teken mag geen onderdeel zijn van klasse `%s' teken geen onderdeel van klasse `%s'?AfgebrokenBenaderen van een beschadigde deel-bibliotheekAdres reeds in gebruikAdres familie niet ondersteund door protocolAdvertise foutAlarmklokArgumentenlijst is te langTracht in te veel deelbibliotheken te linkenAuthenticatie OKAuthenticatie foutOnjuist adresOnjuiste bestandsbeschrijverOnjuist lettertype bestandsformaatOnjuiste meldingOnjuiste systeemaanroepBlokapparaat vereistOmroep selectie probleemOnderbroken pijpBus foutCPU tijdlimiet overschredenKan geen toegang verkrijgen tot benodigd deelbibliotheekbestandKan geen verbinding maken met server van dit domeinKan niet communiceren met portmapperKan niet communiceren met ypbindKan niet communiceren met ypservKan geen geheugen reserverenKan gevraagde adres niet toewijzenKan geen `socket' maken voor omroep rpcKan een deelbibliotheek niet rechtstreeks uitvoerenKan geen antwoord ontvangen om te zendenKan dienst niet registrerenKan niet zenden na afsluiting transporteindpuntKan omroep pakket niet verzendenKan socket optie SO_BROADCAST niet instellenKanaal nummer buiten domeinKind gestoptKlant credential is te zwak (FIXME)Communicatie fout bij zendenComputer heeft het loodje gelegdBerekenen tabelgrootte voor tekenklassen kan even duren...Berekenen tabelgrootte voor collation informatie kan even duren...Verbinding geweigerdVerbinding reset door `peer'Verbinding timed outVoorgezetKopierecht (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 overschredenDatabase is bezigBestemmingsadres vereistApparaat is geen `stream'Apparaat niet geconfigureerdApparaat of bron bezigMap niet leegSchijf quota overschredenDomein niet gebondenEMT trapFout %dFout in onbekend fout systeem: Fout: .netrc bestand is leesbaar voor anderen.Uitwisseling volExec formaat foutFATAAL: systeem heeft `_POSIX2_LOCALEDEF' niet gedefinieerdGefaald (onbekende fout)Bestandsbeschrijver in slechte staatBestand bestaatBestandsslot deadlock foutBestandsnaam te langBestandsgrootte limiet overschredenBestand te grootBestandsgrootte limiet overschredenDrijvende komma uitzonderingFunctie niet geïmplementeerdGratuitous (FIXME) foutOphangenComputer is buiten werkingFout bij opzoeken computernaamI/O mogelijkIOT trap (FIXME)Identifier verwijderdOngeldige instructieOngeldige instructieOngeldig spoelenOngeschikt bestandstype of bestandsformaatOngeschikte `ioctl' voor apparaatOngeschikte bewerking voor achtergrond procesInformatie-aanvraagInvoer/uitvoer foutInterne NIS foutInterne ypbind foutOnderbrekingOnderbroken systeemaanroepOnderbroken systeemaanroep moet opnieuw gestart wordenOnjuist argumentOnjuiste terugverwijzingOnjuiste tekenklassenaamOnjuiste klant credential (FIXME)Ongeldige klant verifier (FIXME)Ongeldig sorteertekenOngeldige inhoud van \{\}Ongeldige apparaat overschrijende koppelingOnjuiste uitwisselingOngeldig of incompleet multibyte of wijd tekenOngeldige voorafgaande reguliere expressieOnjuist bereik eindeOnjuiste reguliere expressieOngeldige vraag codeOnjuiste vraag beschrijverOnjuiste `server' verifier (FIXME)Onjuist slotIs een mapIs een benoemd bestandstypeGedoodNivo 2 gestoptNivo 2 niet gesynchroniseerdNivo 3 gestoptNivo 3 resetVerwijzing is onderbrokenVerwijzingsnummer buiten bereikLokale domeinnaam niet ingesteldLokale brontoewijzingsfoutMachine is niet aangesloten op het netwerkGeheugen uitgeputMelding te langMultihop geprobeerdNIS klant/server versie verschillend - kan geen diensten biedenNIS map databank is slechtNaam is niet uniek op netwerkHeb een authenticator nodigNetwerk heeft verbinding verbroken bij herstellenNetwerk is buiten werkingNetwerk is onbereikbaarGeen CSI structuur beschikbaarGeen XENIX semaphoren beschikbaarGeen adres geassocieerd met naamGeen anodeGeen bufferruimte beschikbaarGeen kindprocessenGeen data beschikbaarGeen sloten beschikbaarGeen overeenkomstGeen medium gevondenGeen melding van gewenst typeNiet meer records in map databankGeen vorige reguliere expressieGeen `op-afstand' programma's geregistreerd. +-Geen route naar computerGeen ruimte meer op apparaatOnbekend bestand of mapSleutel bestaat niet in kaartKaart bestat niet in serverdomeinOnbekend procesGeen XENIX benoemd type bestandGeen mapNumeriek argument is buiten domeinNumeriek resultaat is buiten domeinObject is niet lokaalOneven aantal aanhalingstekensBewerking al in voorbereidingBewerking niet toegestaanBewerking niet ondersteundBewerking niet ondersteund door apparaatBewerking in voorbereidingBewerking zou blokkerenGeen streams bronnen meerPakket niet geïnstalleerdToegang geweigerdStroomstoringVoortijdig einde van reguliere expressieProfiling timer verlopenProtocol driver niet aangeslotenProtocol foutProtocol familie niet ondersteundProtocol niet beschikbaarProtocol niet ondersteundProtocol verkeerd type voor socketStopRFS specifieke foutRPC verkeerde procedure voor programmaRPC fout bij NIS actieRPC programma niet beschikbaarRPC programma versie onjuistRPC structuur is onjuistRPC versie onjuistRPC: (onbekende fout code)RPC: Authenticatie foutRPC: Kan resultaat niet decoderenRPC: Kan argumenten niet coderenRPC: Gefaald (niet gespecificeerde fout)RPC: Niet uitwisselbare RPC-versiesRPC: Port mapper faaltRPC: Procedure niet beschikbaarRPC: Programma niet geregistreerdRPC: Programma niet beschikbaarRPC: Programma/versie niet overeenkomstigRPC: Remote systeem fout (FIXME)RPC: Server kan argument niet decoderen (FIXME)RPC: SuccesRPC: Tijd verstrekenRPC: Niet in staat te ontvangenRPC: Niet in staat te zendenRPC: Onbekende computerRPC: Onbekend protocolRTLD_NEXT gebruikt in niet dynamisch geladen codeAlleen-lezen bestandssysteemReguliere expressie te grootRemote I/O foutOp-afstand adres gewijzigdVerwijder wachtwoord of maak bestand onleesbaar voor anderen.Meld fouten met het `glibcbug' script aan . +-Verkeerde verzoek argumentenResolver Fout 0 (geen fout)Resolver interne foutBron deadlock vermedenBron kwijtBron tijdelijk niet beschikbaarSegmentatie foutServer rejected credential (FIXME)Server rejected verifier (FIXME)Signaal 0Socket operatie op niet-socketSocket type niet ondersteundSoftware veroorzaakte afbreken verbindingSrmount foutStapel foutStale NFS file handle (FIMXE)GestoptGestopt (signaal)Gestopt (tty invoer)Gestopt (tty uitvoer)Stromen pijp foutStruktuur heeft schoonmaak nodigSuccesSysteembron toewijzingsfoutGetermineerdTekstbestand in gebruikTimer afgelopenTe veel nivo's van symbolische verwijzingenTe veel verwijzingenTe veel open bestandenTe veel geopende bestanden op systeemTe veel processenTe veel referenties: kan `splice' niet doenTe veel gebruikersTrace/BPT trapTrace/breakpoint trap (FIXME)Aanhangende `backslash'Vertaler overleden (da's jammer)Er is al verbinding met het transporteindpuntEr is geen verbinding met het transporteindpuntProbeer `%s --help' voor meer informatie. +-Probeer %s... +-Onbekend .netrc sleutelwoord %sOnbekende NIS foutcodeOnbekende fout Onbekende computerOnbekende resolver-foutOnbekende server-foutOnbekend signaal %dOnbekende systeemfoutOnbekende ypbind-foutNiet corresponderende ( of \(Niet corresponderende ) of \)Niet corresponderende [ of [^Niet corresponderende \{Onbekende variabele `%s'Dringende I/O conditieGebruik: %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 . +-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 . +-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 . +-Gebruik: %s variabele_naam [padnaam] +-Gebruik: rpcinfo [ -n portnummer ] -u host prognummer [ versienummer ] +-Gebruiker gedefinieerd signaal 1Gebruiker gedefinieerd signaal 2Waarde te groot voor gedefinieerd data-typeVirtuele timer verlopenWild resultaat afkomstig uit commando uitvoerVenster veranderdGeschreven door %s. +-Onjuist mediumtypeYPBINDPROC_DOMAIN: %s +-Deze keer heb je het echt goed verknaltZone 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' ingangenverwacht `from' na eerste argument van `collating-element'`from' string in vergelijkende element declaratie bevat onbekend tekenargument van <%s> moet één teken zijnargument van `%s' moet één teken zijnauth_none.c - Fataal marshalling probleemonjuist argumentonjuiste eigenaarleeg FROM veld op `Link' regelleeg TO veld op `Link' regelblok is twee keer vrijgegevenbogus mcheck_status, bibliotheek is maar zozobroadcast: ioctl (verkrijg interface configuratie)broadcast: ioctl (verkrijg interface vlaggen)cache_set: slachtoffer niet gevondenkan tijdzone-afkorting (te gebruiken na tijdsaanduiding) niet achterhalenkan procedure nummer %d niet opnieuw toewijzen +-kan locale bestand niet benaderen `%s'kan collation element `%.*s' niet invoegenkan niet invoegen in resultaat tabelkan geen nieuw vergelijking symbool definitie invoegen: %skan niet openenkan databank bestand `%s' niet openen: %skan invoerbestand `%s' niet openenkan locale definitie bestand `%s' niet openenkan uitvoerbestand `%s' niet openenkan uitvoerbestand `%s' niet openen voor categorie `%s'kan de gespecificeerde volgorde niet afhandelenkan tekenkaart map `%s' niet lezenkan locale map `%s' niet lezenkan locale bestand `%s' niet lezenkan uitvoer niet schrijven naar `%s'categorie data meer dan eens gevraagd: zou niet mogen gebeurenteken %s'%s' in klasse `%s' hoort in klasse `%s'teken %s'%s' in klasse `%s' hoort niet in klasse `%s'teken niet gedefinieerd in tekenkaartteken `%s' niet gedefinieerd maar nodig als standaard waardetekenklasse `%s' is al gedefinieerdtekenkaart `%s' is al gedefinieerdtekenkaartbestand `%s' niet gevondenclnt_raw.c - Fataal header serializatie fout.vergelijkings element `%.*s' komt meer dan eens voor: negeer regelvergelijkings symbool `%.*s' komt meer dan eens voor: negeer regelvergelijkings 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 gevondenrichtingsvlag in string %d in tijdperkveld in categorie `%s' is niet '+' noch '-'richtingsvlag in string %d in tijperkveld in categorie `%s' is niet een enkel tekendubbele tekennaam `%s'dubbel sorteerelementdefinitiedubbele definitie voor teken `%.*s'dubbele sleuteltweede set definitiedubbele zonenaam %s (bestand "%s", regel %d)gedupliceerde meldings identifierdubbel meldingnummerlege gewicht naam: regel genegeerdenablecache: cache is al mogelijkenablecache: kan geen cache allocerenenablecache: kan geen cache data allocerenenablecache: kan geen cache fifo allocereneindpunt van ellipsis bereik is groter dan startpuntfout tijdens invoegen vergelijkings element in hash tabelfout tijdens bij invoegen in hash tabelverwacht string argument voor `copy'verwachte voortgangsregel niet gevondengefaald bij schrijven data voor categorie `%s'fcntl: F_SETFDveld `%s' uit categorie `%s' niet gedefinieerdveld `%s' uit category `%s' ongedefinieerdvan-waarde van `collating-element' moet een string zijnfstat faalderommel aan het einde van de tekencodespecificatierommel aan het einde van nummerrommel 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 gekoppeldongeldige CORRECTION veld op schrikkel regelongeldig Rolling/Stationary veld op schrikkelregelongeldige tekenconstante in stringongelding vergelijkings elementongeldige definitieongeldige codering gegevenongeldige escape reeks aan het einde van stringongeldige namen voor tekenreeksongeldig nummer voor offset in string %d in `era' veld in categorie `%s'ongeldig set nummerongeldig 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 toegestaanimplementatielimiet: niet meer dan %d tekenkaarten toegestaanonjuist geformateerd bestandinvoer regel van onbekend typeinterne 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 %uonjuiste GMT offsetonjuist afkortingsformaatongeldige dag van de maandongeldig ending jaar (FIXME)ongeldig schrikkeljaarongeldige maandnaamongeldig bewaarde tijdongeldig starting jaar (FIXME)ongeldige tijd van de dagongeldig naam voor weekdagregel na ellipsis moet een teken definitie bevattenregel voor ellipsis bevat geen constante teken definitieregel te langlocale bestand `%s', gebruikt in `copy' statement, niet gevondenlstat faaldeverkeerde regel genegeerdgeheugen clobbered voordat blok gereserveerd was (FIXME)geheugen `clobbered' na het einde van een gealloceerd blokgeen geheugen meer beschikbaargeen geheugen meer beschikbaar +-geheugen is consistent, bibliotheek is buggyontbrekend era formaat in string %d in `era' veld in category `%s'ontbrekende era naam in string %d in `era' veld in category `%s'naamloze regelnooit geregistreerd programma %d +-geen correct reguliere expressie voor veld `%s' in category `%s': %sgeen enkele dag van de maand voldoet aan voorwaardegeen definitie van `UNDEFINED'geen ander sleutelwoord mag worden gespecificeerd wanneer `copy' is gebruiktgeen uitvoer bestand gemaakt omdat waarschuwingen zijn gegevengeen symbolische naam gegevengeen symbolisch naam gegeven voor einde bereikgeen gewicht gedefinieerd voor symbool `%s'geen gewoon bestandalleen WIDTH definities zijn toegestaan na de CHARMAP definitieproblemem 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 momentrpcinfo: %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 portmapperrpcinfo: kan geen kontakt krijgen met portmapper: zelfde regel naam in meerdere bestandenselect: protocol mislukt in opstart circuit +-socket: protocol mislukt in opstart circuit. +-sorteervolgorde `forward' en `backward' zijn niet eenduidigspecificatie van sorteergewich voor collation symbool heeft geen zinstandaardinvoerstandaarduitvoerbegindatum is ongeldig in string %d in `era' veld in category `%s'beginjaar is groter dan eindejaarbeginjaar is te groot om weergegeven te wordenbeginjaar is te laag om weergegeven te wordeneinddatum is onjuist in string %d in `era' veld in category `%s'svc_run: - select misluktsvc_tcp: makefd_xprt: geen geheugen meer +-svctcp_.c - `getsockname' of `listen' lukken nietsvctcp_.c - udp socket aanmaak probleemsvctcp_create: geen geheugen meer beschikbaar +-svcudp_create - `getsockname' lukt nietsvcudp_create: socket aanmaak probleemsymbool voor multikarakter vergelijkings element `%.*s' dupliceerd +-element definitiesymbool voor multikarakter vergelijkings element `%.*s' dupliceert +-andere element definitiessymbool voor multikarakter vergelijkings element `%.*s' dupliceert +-andere symbool definitiesymbool voor multikarakters vergelijkings element `%.*s' dupliceerd symbooldefinitiesymbool voor multikarakter vergelijkings element `%.*s' dupliceerd symbolische naam in karaktersetsyntactische fout in %s definitie: %ssyntactische fout in `order_start' directiefsyntactische fout in tekenklasse definitiesyntactische fout in tekenomzettingsdefinitiesyntactische fout in collating volgorde definitiesyntactische fout in vergelijkings definitiesyntactische fout in definitie van LC_CTYPE categorysyntactische fout in definitie van nieuwe tekenklassesyntactische fout in definitie van nieuwe tekenkaartsyntactische fout in melding locale definitiesyntactische fout in monetaire locale definitiesyntactische fout in numerieke locale definitiesyntactische fout in volgorde specificatiesyntactische fout in prolog: %ssyntactische fout in tijd locale definitiesyntactische fout: niet in een locale definitie deeldit is de eerste definitietijd voor nultijd overflowte weinig bytes in karaktercoderingte veel bytes in karaktercoderingte veel karakterklassen gedefinieerdte veel schrikkelsecondente veel lokale tijd typente veel overgangen?!te veel gewichtente veel, of te lange, tijdzone afkortingenrommel aan het einde van de regelmoeite met antwoorden naar programma %d +-twee regels in een rij bevattende `...' zijn niet toegestaantyped enkel jaar (FIMXE)ongedefinieerdonbekend karakter `%s'onbekend karakter in veld `%s' uit category `%s'onbekende vergelijkings afgeleideonbekende richtlijn `%s': regel genegeerd (FIXME)onbekende set `%s'onbekend symbool `%.*s': regel genegeerdregelloze zoneniet getermineerde meldingniet getermineerde stringniet getermineerde symbolische naamniet getermineerde gewichtnaamgrootste limiet in bereik is niet kleiner dan kleinste limietgebruik van 29 februari in niet schrikkeljaarwaarde voor %s moet een integer zijnwaarde voor <%s> moet tussen 1 en 4 liggenwaarde voor veld `%s' in categorie `%s' mag geen lege string zijnwaarde van moet groter zijn dan de waarde van waarde van veld `int_curr_symbol' in categorie `LC_MONETARY' +-korrespondeert niet met een geldige naam in ISO 4217de lengte van waarde van veld `int_curr_symbol' in categorie +-`LC_MONETARY' is niet juistwaarden voor veld `%s' uit categorie `%s' moeten kleiner zijn dan 127waarden voor veld `%s' uit categorie `%s' mogen geen nul zijnbij openen UTMP bestandbij openen oud catalogusbestandtijdens voorbereiden uitvoerbij lezen databankbij schrijven databankbestandoverschrijfbaar door anderen dan de eigenaaronjuist aantal argumentenonjuist aantal velden op schrikkelregelonjuist aantal velden op `Link' regelonjuist aantal velden op `Rule' regelonjuist aantal velden op `Zone' voortgangsregelonjuist aantal velden op `Zone' regelyp_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„“ì68I9ILIM_IE­I&óI(JCJTJlJ~JJ¡J¼JÖJnêJYLkL"}L" LÃL:ßLM#M,MBMYMsMŠM¤M½MÙMòMN(NEN]N{N‚N NªN±N3ÃN3÷N4+O.`O%OµO&ÉO%ðOP%-P3SP,‡P)´PÞP"÷P!Q]K]f]}]™]¶]@Ï]D^U^h^^ –^= ^Þ^Çø^À_2ß_-`@`$S` +-x`ƒ`‰`!`¯`À`Ù`ö` +-a a8aSaga{a3a-Ãa2ña$b5b>bEbUbob<†bÃb)ãb cc1-c8_c˜c³c ÐcÜcøc d$d3dKd"dd‡d d§dŽÄdSe he‰e¤e¸eÉe Ýeëe$ f0f"7f%Zf"€f"£f%Æf ìfùf g>g^gggkg~g!’g ´g!Ágãg.h1h Eh Rh"_h‚h•h¨h ¾hÈh+àh i)i:iQiniˆi i¼iÔiîi1ÿi$1jVjhjƒj˜j³j ËjØjçj +-üjkk2kGkVkok ~kŒk¨k¾k×kíkýk!l9lWlswlëlmm'mFmYmmm…m›m®m ³mÀm9Ämþmn,n,En +-rn}n „n‘n¬nÆnÞn#ñno%o™¥Ø¥!÷¥ ¦$:¦_¦*u¦= ¦HÞ¦'§6§EF§&Œ§(³§'ܧE¨J¨(c¨'Œ¨$´¨,Ù¨)©%0©V©"t©—©&µ©Ü©Pû©VLªU£ªOùªVI«! «'«*ê«/¬*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¸Cf¸%ª¸&и÷¸¹(¹?¹S¹j¹…¹Ÿ¹°³¹d»x» Œ» ­»λ7ê» "¼,¼4¼I¼ e¼†¼¡¼ Á¼%â¼½$(½M½#l½½ª½ ȽÒ½ î½ú½¾1¾1H¾3z¾/®¾$Þ¾¿7¿!P¿r¿&ˆ¿1¯¿-á¿*À:À(XÀ-À¯ÀÉÀåÀÁ!Á&?Á6fÁÁ%¶Á%ÜÁ%Â%(Â%NÂtÂ#ŽÂ+²ÂÞÂûÂÃ'-ÃUÃ#tÃ'˜Ã(ÀÃ!éÃ$ Ä!0ÄRÄrÄģļĎÕÄ1dÅ–Å#µÅ/ÙÅ Æ$Æ?Æ:HƃÆ(’Æ»Æ)×Æ Ç,Ç(;Ç"dLJljǛÇ#±ÇÕÇ-ñÇ.ÈNÈ _ÈlÈ,‡È0´ÈåÈöÈ ÉÉ(É>É^ÉnÉÉœÉ ¶ÉÃÉÖÉæÉïÉ"óÉ"Ê.9Ê+hÊ#”ʸÊØÊøÊ%Ë.5Ë,dË.‘Ë%ÀËæË;Ì!?Ì(aÌ(ŠÌ-³Ì(áÌ( +-Í$3ÍXÍrÍ!ƒÍ¥Í¼ÍÛÍøÍ?ÎMOÎÎ$¯Î"ÔÎ +-÷Î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ß4z߯ßÀß Çß"Ôß÷ßà-à+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ì?ìCWì&›ì!Âìäì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·ý"ëý)þK8þ/„þ#´þ<Øþ#ÿ 9ÿGÿ"Zÿ}ÿ'—ÿ¿ÿÓÿ*ìÿ-0-^0Œ½Ö,ò<&Y €!¡#Ãç73:9n&¨8Ï"!+M2lŸ¿ ßCBD)‡±#È+ì?"X&{¢"¸LÛN(w-#½áò*:Zs‚0 1Ñ66:q†>¢á - ;H "„ § #Ä (è $ +-6 +-/U +-.… +-+´ +-à +-'ï +-# 5; 3q  ¥ *² Ý K÷ GC G‹ Ó 5å 1 2M %€ ¦ )Å 1ï !?Us†'š'ÂêGe:y:´Aï>1p‰ ¡.Â0ñ0"Sn†¡·Ç×ò(=(Q+z;¦â$ñ+ BO&h++»ç÷,:58p ©0·!è; +-=F.„"³Ö+ð<&Y€2 /Ó2#Rv0‰ºBÍ,=C\m‰8¤!Ý-ÿ'-#U!y-›Éæ%"D?g§%Æì-42O@‚Jà B1t'’'ºBâ%3>0r%£5É4ÿ&4[*z¥/ÄôMWbUºL Q] "¯ 'Ò &ú ,!!3N!)‚!/¬!)Ü!)"*0")["+…"%±"×",ð"&#,D#'q# ™# º#Ç#Ú#ô#$/$G$b$y$.Š$)¹$ã$3%4%,N%{% ˜%¢%'³%Û%%û%!&8&$I&n&}&&¢&¼&Ö&4ê&'2'M'%k'@‘'BÒ'b(Lx(?Å($)%*)&P)w)#–)º)Ò)#è) *+*A*\* s* ”* µ*-Ö* +%+D+1c+(•+´|κQº&œðªÇçàûìߦ¡"FË/etIV¹ÝÖ‚Q™‰I¢¢lþå'  ]Ζ_ŒÇÁ +-Ÿ ‹Ž<Ñ5Œ¶µÕ %gYw ä¡8 ÝßÑ6+y›e +-ÜGý—鬢J6Ä5H0òók‘·M€NCVôjÃ¥kÎÙcë°Þ,Cd3ÉŒ^÷‡þT©©f*ˆè<8îT þ d@q0JBpõP¨)›%Z[|Xpí;goi]¯.ËüãF6œOî*ƒ”Ìä3$BZDnÒêú…-æ`·:Y/´¶íëº2÷7ÚSz"\ !õ…ÿ„#¿“yöw§UHLz'Ôm%=IUž:ô¥½õjç­¨“eEš^·A É5ï(•Ðfo=r\bik­-O{` 4‹ÿ9k–ÒBƒ‘ƒø,Õ¿ùâŸf¼‡u0x×:1ø&ÓH”§P¶KóëLL‚ùƉÖÛXvÈ1 d&K$é˜Äú¦Y¿¦€_IÙn78hNŽ\;Š¥ÇuBMÆÂ^±rŠR~Úö +- »¼Zà)Ãm9Á£|X¸ ãÔEéš1("’Ðù;*D}®’—•ó³Å{® Wmêý•ÒÚN²yQ(8AØšúæ O­K–‹>_§tµÍ&Æ[ï×,7 Б֯@]*«ÛÅàiJ-òoüpÀ<E¼™a,?üjMŸÓ.P"‰cãYzæ(²xgžwáv™†¤Â¾ªR~Zöˆ“30Íœ¾`÷©h's2G½5ìFñÀcCò¡Ï?%qbì¨Ê.WAðKgßÌ9s:¹¯m°Ñj>—h@>刬ePuaÔ[äÂW\ÝlÈèq/£#O2¤…VS#ÿÓÀ+„D6då→ŀUïRØû âð#¸l˜ÛÄè9!ᣵ›«ØXê7h!«ÊbF`ÞH +-¬!iñrT[$×fS{ô ³=U´sž»@Lc<Ž¾~ Ë^Ênbx24î„V³.)±D$ªñaý]l¤ÈC½GÌ”vÁ+ɲ;¸?_?˜û}ÜÕ͇TEM®¹Níá†}»ç=J'4R/>-Ù 4Q+°GøÞt±)aWS1ÏŠÏ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.Memory allocation failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name not unique on networkName or service not knownName/entry isn't uniqueNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOwner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableSUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock 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_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempreprocessor errorprint progress informationproblems 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 momentrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Norwegian +-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: må være større enn +-%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ådetegnet kan ikke være i klassen «%s»tegnet er ikke i klassen «%s»?Avbrutt (SIGABRT)Tilgangsrettigheter: Aksesserer et skadet delt bibliotekAdressen er allerede i brukAdressefamilien for vertsnavn er ikke støttetAdressefamilien er ikke støttet av protokollenAnnonseringsfeilAlarmen gikkArgumentlisten er for langForsøk på å fjerne en tabell som ikke er tomForsøker å linke inn for mange delte bibliotekerAutentisering OKAutentiseringsfeilFALSKT OBJEKT +-Ugyldig adresseUgyldig fildeskriptorUgyldig format på typesnittsfilUgyldig meldingUgyldig systemkallUgyldig verdi for ai_flagsVær strengt POSIX-konformBinære data +-Blokk-enhet krevesRøret ble bruttBussfeilCDSBegrensning av CPU-tid overskredetTidsgrense for hurtigbuffer løp utKan ikke aksessere et nødvendig delt bibliotekKan ikke koble til tjener for dette domenetKan ikke kommunisere med portmapperKan ikke kommunisere med ypbindKan ikke kommunisere med ypservKan ikke tildele minneKan ikke benytte den ønskede adressenKan ikke opprette socket for kringkastings-rpcKan ikke eksekvere et delt bibliotek direkteKan ikke ha mer enn ett fil-genereringsflagg! +-Kan ikke ta imot svar på kringkastingKan ikke registrere tjenesteKan ikke sende etter at transportendepunktet har koblet nedKan ikke sende kringkastingspakkeKan ikke sette socket-flagg SO_BROADCASTKan 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 intervallTegn-separator : %c +-Barnet avsluttetKlientens referanser er for svakeKolonner : +-Kommunikasjonsfeil ved sendingKompiler lokal-spesifikasjonDatamaskinen tok ferieBeregning av tabellstørrelse for tegnklasser kan ta en stund...Beregning av tabellstørrelse for sammenligningsinformasjon kan ta en stund...Oppkobling nektesForbindelsen brutt i den andre endenOppkoblingen overskred tidsgrensenFortsetterKonverter innkoding av gitte filer fra en innkoding til en annen.Konverter nøkkel til små bokstaverCopyright (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 gittLag en enkel DB-database fra tekst-input.Opprettelsestid: %sDES-innslag for nettnavn %s er ikke unikt +-KATALOG +-DNANSDNSDatabase for tabell eksisterer ikkeDatabasen er opptattForvalgte tilgangsrettigheter: +-Måladresse krevesEnheten er ikke en streamEnheten er ikke konfigurertEnheten eller ressursen opptattDiffie-Hellmannn (%d bits) +-Katalog : %s +-Filkatalogen er ikke tomDiskkvoten er overskredetIkke spalt ut ny prossess og vis meldinger på nåværende ttyIkke skriv meldinger under bygging av databasenIkke bruk eksisterende katalog, tving opprettelse av ny utfilDomenet er ikke bundetEmulatorfelleINNSLAG +-Kryptert data +-Innslag-/tabell-type stemmer ikke overensFeil i undersystem til RPCFeil ved aksessering av NIS+ kaldstartfil. Er NIS+ installert?Feil i ukjent feilsystem: Feil: .netrc kan leses av andre.Veksel fullUgyldig format på eksekverbar filFATALT: systemet definerer ikke «_POSIX2_LOCALEDEF»FIL inneholder mapping fra symbolske navn til UCS4-verdierFeilet (uspesifisert feil)Fildeskriptor i ugyldig tilstandFilen eksistererFillåsing feilet på grunn av vranglåsFor langt filnavnGrense for filstørrelse overskredetFor stor filFørste/neste-kjede ødelagtUnntakstilfelle ved flyttallsoperasjonFull resynkoronisering trengs for katalogFunksjonen er ikke implementertGRUPPE +-Søppel i ARGP_HELP_FMT: %sGenerer meldingskatalog.\vHvis INNFIL er - lese inndata fra standard inn. Hvis UTFIL +-er - skrives utdata til standard ut. +-Generell systemfeilHent informasjon spesifikk for lokalet.Gi en kort bruksmeldingGi denne hjelpelistenUmotivert feilGruppe : %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 nedeOppslag av vertsnavn feiletI/O muligINNFIL UTFIL +--o UTFIL INNFIL +--u INNFILIOT-felleIVYIdentifikator tatt bortUlovlig instruksjon (SIGILL)Ulovlig objekttype for operasjonUlovlig søkeoperasjonUegnet filtype eller formatUegnet «ioctl» for enhetUegnet operasjon for bakgrunnsprosessInformasjonsforespørsel (SIGINFO)Informasjon:Innfiler:Inn-/ut-formatspesifikasjon:Inn/ut-feilIntern NIS-feilIntern ypbind-feilAvbruttAvbrutt systemkallAvbrutt systemkall burde startes omUgyldig objekt for operasjonUgyldig argumentUgyldig bak-referanseUgyldig tegnklassenavnUgyldige klientreferanserUgyldig klientverifikatorUgyldig sammenligningstegnUgyldig bruk av \{\}Ugyldig link over adskilte enheterUgyldig vekselUgyldig eller ufullstendig multibyte eller bredt tegnUgyldig foregående regulært uttrykkUgyldig intervallsluttUgyldig regulært uttrykkUgyldig tilgangskodeUgyldig forespørseldeskriptorUgyldig tjenerverifikatorUgyldig plassEr en filkatalogEr en navngitt filtypeKerberos. +-DreptLINK +-LOKALT innslag for UID %d i katalog %s er ikke unikt +-Nivå 2 stoppetNivå 2 ikke synkronisertNivå 3 stoppetNivå 3 startet omLink peker til ugyldig navnLinken har blitt skadetLinknummer utenfor gyldig områdeLinket objekttype: Linket til: %s +-Lokalt domenenavn er ikke sattTildelingsfeil for lokal ressursMaskinen er ikke på nettverketFeilaktig eller ulovlig navnObligatoriske eller frivillige argumenter til lange flagg er også obligatoriske eller frivillige for tilsvarende korte flagg.MinneallokeringsfeilMinnet oppbruktFor lang meldingAtributt mangler eller er feilaktigEndringstid : %sEndring feiletEndringsoperasjon feiletEndre format for utdata:Forsøkte viderehoppNAVNNAVN +-[-a|-m]NISNIS klient/tjener versjonsforskjell - kan ikke betjeneNIS' kart-database er korruptNIS+-operasjon feiletNIS+-tjenere er ikke tilgjengeligeNIS+-tjeneste er utilgjengelig eller ikke installertIKKE NOE OBJEKT +-NUMMERNavn : «%s» +-Navnet er ikke unikt på nettverketNavn eller tjeneste ukjentNavn/innslag er ikke uniktMå ha noen til å autentisereNettverket tok ned forbindelsen ved omstartNettverket er nedeNettverket er ikke tilgjengeligIngen CSI-strukturer tilgjengeligeIngen XENIX-semaforer tilgjengeligeIngen adresse assosiert med vertsnavnIngen adresse assosiert med navnetIngen anodeIkke mer buffer-plass tilgjengeligIngen barneprosesserIngen data er tilgjengeligeIkke mer plass på enhetenIngen låser tilgjengeligeIngen treffMedium ikke funnetIngen meldinger av ønsket typeIngen flere poster i tabellenIntet foregående regulært uttrykkIngen fjernprogram registrerte. +-Ingen rute til vertsmaskinenIkke mer plass på enhetenIngen slik enhetIngen slik fil eller filkatalogIngen slik nøkkel i tabellenIngen slik tabell i tjenerens domeneIngen slik prosessUoverkommelig feil i navneoppslagIngen. +-Ikke funnet, ikke noe slikt navnIkke en XENIX navngitt filIkke en filkatalogIkke funnetIkke eierAntall kolonner : %d +-Antall objekter : %u +-Numerisk argument er utenfor definert områdeNumerisk resultat er utenfor gyldig områdeObjekt #%d: +-Objektnavn : %s +-Objekttype : Er et fjernobjektObjekt med samme navn eksistererOdde antall siteringstegnBare root har lov til å bruke dette flagget!Operasjonen er allerede under utførelseOperasjonen er ikke tillattOperasjonen er ikke støttetOperasjonen er nå under bearbeidingOperasjonen ville ha blokkertIkke flere streams-ressurserEier : %s +-PRIVAT +-Pakken er ikke installertFeil under tolkning: %sDelvis suksessOverført objekt er ikke det samme objektet på tjenerenIkke tilgangStrømmen gikkFor tidlig slutt på regulært uttrykkSkriv ut innholdet av en databasefil, ett innslag per linjeSkriv ut nåværende konfigurasjonsstatistikkSkriv flere meldingerSkriv programversjonSannsynligvis ikke funnetProfileringstiden tok sluttProtokolldriver er ikke tilkobletProtokollfeilProtokoll-familien er ikke støttetProtokollen er ikke tilgjengeligProtokollen er ikke tilgjengeligProtokollen er ikke riktig type for socketAvsluttetRFS-spesifikk feilRPC: ugyldig prosedyre for programRPC-feil ved NIS-operasjonRPC-programmet er ikke tilgjengeligRPC: feil programversjonRPC-strukturen er ugyldigfeil RPC-versjonRPC: (ukjent feilkode)RPC: Feil ved autentiseringRPC: Kan ikke dekode resultatetRPC: Kan ikke kode argumentetRPC: Feilet (uspesifisert feil)RPC: Inkompatible versjoner av RPCRPC: Feil i portmapperRPC: Prosedyre ikke tilgjengeligRPC: Programmet ikke registrertRPC: Programmet utilgjengeligRPC: Program/versjon-uoverensstemmelseRPC: Systemfeil hos mottakerRPC: Tjener kan ikke dekode argumenteneRPC: SuksessRPC: Tidsgrensen overskredetRPC: Kan ikke ta imotRPC: Kan ikke sendeRPC: Ukjent vertsmaskinRPC: Ukjent protokollRSA (%d bits) +-RTLD_NEXT brukt i kode som ikke er dynamisk lastetLed og vis profileringsdata for delt objektLed konfigurasjonsdata fra NAMEFilsystem med kun lesetilgangRegulært uttrykk for stortI/O-feil på fjern maskinFjernadresse endretTa bort passord, eller gjør filen ulesbar for andre.Gjenåpning av delt objekt «%s» feiletReplikér: +-Rapporter bugs til %s. +-Rapporter feil ved å bruke skriptet «glibcbug» til . +-Argumenter for forespørsel er ugyldigeNavnetjeneste-feil 0 (ingen feil)Intern feil i navnetjenestenKlarte å unngå vranglås ved tildeling av ressursRessurs taptRessursen midlertidig utilgjengeligSUNYPSøkesti : %s +-MinnesegmentsfeilTjener opptatt, prøv igjenTjener tom for minneTjener forkastet referanseneTjener forkastet verifikatorServname ikke støttet for ai_socktypeSett programnavnetSlå av tjenerenSignal 0Socket-operasjon på noe som ikke er en socketSocket-typen er ikke støttetProgramvare forårsaket forbindelsesbruddBeklager. Du er ikke root +-Kildedefinisjoner ikke funnet i FILSrmount-feilStakkfeilForeldet NFS-filhåndtakStart ANTALL tråderStatus : %s +-StoppetStoppet (signal)Stoppet (ville lese fra tty)Stoppet (ville skrive til tty)Streams-rørfeilStrukturen trenger oppryddingSuksessUndertrykk advarsler og informasjonsmeldingerSymbolske tegnnavn definert i FILSystemfeilSysteminformasjon:Kunne ikke tildele systemressursTABELL +-Tabelltype : %s +-Midlertidig feil i navneoppslagTerminertProgramfil opptattDen 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 utFor mange attributterFor mange nivåer med symbolske linkerFor mange linkerFor mange åpne filerFor mange åpne filer i systemetFor mange prosesserFor mange referanser: kan ikke spleise sammenFor mange brukereSporings-/stoppunkts-felleEtterfølgende backslashTolken dødeTransport-endepunktene er allerede sammenkobletTransport-endepunktene er ikke sammenkobletPrøv «%s --help» eller «%s --usage» for mer informasjon. +-Prøver %s... +-Type: %s +-UKJENTIkke i stand til å autentisere NIS+-klientIkke i stand til å autentisere NIS+-tjenerIkke i stand til å lage tilbakekallIkke i stand til å opprette prosess på tjenerenUkjent (type = %d, bits = %d) +-Ukjent .netrc-nøkkelord %sUkjent NIS-feilkodeUkjent database: %s +-Ukjent feilUkjent feil Ukjent vertUkjent objektUkjent flagg: %s %s %sUkjent navnetjeneste-feilUkjent tjener-feilUkjent signal %dUkjent systemfeilUkjent ypbind-feilUbalansert ( eller \(Ubalansert ) eller \)Ubalansert [ eller [^Ubalansert \{Ukjent variabel «%s»Kritisk I/O-tilstandBruk:Bruk: %s variabelnavn [søkesti] +-Bruk: rpcinfo [ -n portnr ] -u vert prognr [ versnr ] +-Brukerdefinert signal 1Brukerdefinert signal 2Verdien er for stor for den definerte datatypenVirtuell tidsgrense overskredetVilt resultat fra eksekvering av kommandoVinduet ble endretSkriv navnene til tilgjengelige lokalerSkriv navnene til valgte kategorierSkriv navnene til valgte nøkkelordSkriv utdata til fil NAVNSkrevet av %s. +-Gal mediatypeX500XCHSYPBINDPROC_DOMAIN: %s +-Ja, 42 er meningen med livetDenne gangen rotet du det virkelig tilSluttiden 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 tegnai_family er ikke støttetai_socktype er ikke støttetkjører alleredeargument til <%s> må være ett enkelt tegnargument til «%s» må være ett enkelt tegnauth_none.c - Fatal kodingsfeilauthunix_create: ikke mer minne +-ugyldig argumentfeil eiertomt «FROM»-felt på «Link»-linjetomt «TO»-felt på «Link»-linjeblokk frigjort to ganger +-feilaktig mcheck_status, biblioteket er bugget +-broadcast: ioctl (hent grensesnittkonfigurasjon)broadcast: ioctl (hent grensesnittsflagg)cache_set: kunne ikke allokere nytt rpc-buffercache_set: offer-allokering feiletcache_set: offer ikke funnetkan ikke avgjøre tidssoneforkortning for bruk rett etter «until»-tidkan ikke omfordele prosedyrenummer %d +-kan ikke utføre «stat» på lokalefil «%s»kan ikke allokere symboldatakan ikke opprette intern deskriptorkan ikke opprette interne deskriptorerkan ikke få socket til å akseptere forbindelser: %skan 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 %dkan ikke sette inn sammenligningselement «%.*s»kan ikke sette inn i resultattabellkan ikke sette inn ny definisjon av sammenligningssymbol: %skan ikke laste inn profileringsdatakan ikke åpnekan ikke åpne «%s»kan ikke åpne databasefil «%s»: %skan ikke åpne innfil «%s»kan ikke åpne lokaledefinisjonsfil «%s»kan ikke åpne utfilkan ikke åpne utfil «%s»kan ikke åpne utfil «%s» for kategori «%s»kan ikke åpne socket: %skan ikke behandle spesifikasjon av rekkefølgekan ikke lese filkatalogen for tegnkart, «%s»kan ikke lese konfigurasjonsfil; dette er fataltkan ikke lese fra klientkan ikke lese hode fra «%s»kan ikke lese filkatalogen for lokaler, «%s»kan ikke lese lokalefil «%s»kan ikke lese statisitkkdatakan ikke utføre stat() på fil «%s»: %skan ikke skrive utfiler til «%s»kan ikke skrive ut resultat: «%s»kan ikke skrive ut statistikk: «%s»kan ikke skrive til klientkategoridata forespurt mer enn en gang: burde ikke skjetegnet %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 ikke definert i tegnkartettegnet «%s» ikke definert, men behøves som standardverditegnklassen «%s» allerede definerttegnkartet «%s» allerede definerttegnkartfilen «%s» ikke funnetclnt_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 ignorertsammenligningssymbol «%.*s» finnes mer enn en gang: linje ignorertsammenligningssymbol forventet etter «%s»koble til adresse %s: konstant eller identifikator ventetkonvertering fra «%s» til «%s» ikke støttetkonvertering stoppet på grunn av problem ved skriving av utdatakunne ikke opprette en rpc-tjener +-kunne ikke registrere prog %d vers %d +-database [nøkkel ...]standard tegnkart «%s» ikke funnetretningsflagg 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 tegnduplisert tegnnavn «%s»duplisert definisjon av sammenligningselementduplisert definisjon av tegn «%.*s»duplisert nøkkelduplisert definition av settduplisert sonenavn %s (fil «%s», linje %d)duplisert meldingsidentifikatorduplisert meldingsnummertom tegnstrengtomt vektnavn: linje ignorertenablecache: cache/hurtigminne allerede slått påenablecache: kunne ikke tildele cache/hurtigminneenablecache: kunne ikke tildele cache/hurtigminne-dataenablecache: kunne ikke tildele cache/hurtigminne-fifoinnkoding for utdatainnkoding av original tekstsluttverdien for ellipseintervallet er større enn startverdienfeil ved lukking av input «%s»feil ved lukking av utfilfeil ved lukking av datafilen for profileringfeil ved innsetting av sammenligningselement i hashtabellenfeil ved innsetting i hashtabellenfeil under lesing av inndataforventet strengargument for «copy»forventet fortsettelseslinje ikke funnetklarte ikke å laste delt objekt «%s»klarte ikke å laste symboldataklarte ikke å mmap'e filen med profileringsdataklarte ikke å starte konverteringsprosesseringfeil ved skriving av data for kategori «%s»fcntl: F_SETFDfelt «%s» i kategori «%s» ikke definertfelt «%s» i kategori «%s» udefinertfilen «%s» eksisterer fra før og kan bli overskrevet +-fra-verdi for «collating-element» må være en strengfstat feiletsøppel på slutten av tegnkodespesifikasjonsøppel på slutten av tallsø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-grafget_myaddress: ioctl (hent grensesnittskonfigurasjon)getent - hent innslag fra administrativ database.handle_request: forespørsel mottatt (versjon = %d)hard link feilet, symbolsk link brukthardlinket et eller annet stedulovlig «CORRECTION»-felt på «Leap»-linjeulovlig «Rolling/Stationary»-felt på «Leap»-linjeulovlig tegnkonstant i strengulovlig tegn i file: ulovlig sammenligningselementulovlig definisjonulovlig koding gittulovlig tegnsekvens ved slutt av strengulovlig inndatasekvens ved posisjon %ldulovlig navn for tegnområdeulovlig nettype: «%s» +-ulovlig tall for tilleggsverdi i streng %d i «era»-felt i kategori «%s»ulovlig sett-nummerulovlig 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 tillattimplementasjonsbegrensning: ikke flere enn %d tegnkart tillattfeilaktig formattert filinnlinje av ukjent typeintern feil (ulovlig deskriptor)intern feil - addtype kalt med feilaktig isdstintern feil - addtype kalt med feilaktig ttisgmtintern feil - addtype kalt med feilaktig ttisstdintern feil i %s, linje %uugyldig UTC-forskyvningugyldig forkortningsformatugyldig dag i månedenugyldig sluttårugyldig skuddårugyldig modus for dlopen()ugyldig månedsnavnugyldig lagret tidugyldig startårugyldig tid på dagenugyldig ukedagsnavnnøkkellengde i forespørsel for lang: %Zdlinje etter ... må inneholde tegndefinisjonlinje foran ... inneholder ikke definisjon for tegnkonstantfor lang linjelist opp alle kjente kodede tegnsettlokalefil «%s», brukt i «copy», ikke funnetlstat feiletfeilaktig linje ignorertmapping av seksjonsoverskrifter feiletområdet foran tildelt minneblokk tilgriset +-området etter tildelt minneblokk tilgriset +-minnet oppbruktminnet oppbrukt +-minnet er konsistent, biblioteket er bugget +-eraformat i streng %d i «era»-felt i kategori «%s» manglereranavn i streng %d i «era»-felt i kategori «%s» manglernavnløs regelverken original- eller mål-innkoding spesifisertnetname2user: (nis+-oppslag): %s +-netname2user: DES-innslag for %s i katalog %s er ikke uniktnetname2user: LOKAL-innslag for %s i katalog %s er ikke uniktnetname2user: manglende gruppeid-liste i «%s».netname2user: skulle ikke ha uid 0aldri registrert prog %d +-ingen - eller -verdi gittfeilaktig regulært uttrykk for felt «%s» i kategori «%s»: %singen dag i måneden passer til regeleningen definisjon av «UNDEFINED»ingen andre nøkkelord skal angis når «copy» brukespå grunn av advarsler ble ingen utfil opprettetikke noe symbolsk navn gittikke noe symbolsk navn gitt for slutten på områdetingen vekt definert for symbol «%s»ikke en vanlig filnscd-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»utfilpmap_getmaps rpc-problempreprosessorfeilskriv framdriftsinformasjonproblem 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 skuddsekundstidspunktrpcgen: 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 portmappersamme regel i flere fileravkortet lesing ved lesing av forespørsel: %savkortet skriving i %s: %ssocket: protokollfeil i oppsetting av forbindelse +-sorteringsrekkefølge «forward» og «backward» utelukker hverandrespesifikasjon av sorteringsvekter for sammenligningssymbol gir ikke meningstandard innkanalstandard utkanalstartdato er ikke tillatt i streng %d i «era»-felt i kategori «%s»startår er større enn sluttårstartår for høyt til å bli representertstartår for lavt til å bli representertsluttdato er ikke tillatt i streng %d i «era»-felt i kategori «%s»svc_run: - select feiletsvc_tcp.c - kan ikke kalle getsockname eller listensvc_tcp.c - problem med oppretting av tdp-socketsvc_tcp: makefd_xprt: ikke mer minne +-svc_unix.c - problem med oppretting av AF_UNIX-socketsvc_unix.c - kan ikke kalle getsockname eller listensvc_unix: makefd_xprt: ikke mer minne +-svctcp_create: ikke mer minne +-svcudp_create - kan ikke kalle getsocknamesvcudp_create: ikke mer minne +-svcudp_create: problem ved oppretting av socketsvcunix_create: ikke mer minne +-symbol for flertegnssammenligningselement «%.*s» dupliserer elementdefinisjonsymbol for flertegnssammenligningsselement «%.*s» dupliserer en annen +-elementdefinisjonsymbol for flertegnssammenligningselement «%.*s» dupliserer en annen +-symboldefinisjonsymbol for flertegnssammenligningselement «%.*s» dupliserer +-symboldefinisjonsymbol for flertegnssammenligningselement «%.*s» dupliserer +-symbolnavn i tegnsettsyntaksfeil i definisjon av %s: %ssyntaksfeil i nøkkelordet «order_start»syntaksfeil i definisjon av tegnklassesyntaksfeil i definisjon av tegnkonverteringsyntaksfeil i definisjon av sammenligningssorteringsyntaksfeil i definisjon av sammenligningsyntaksfeil i definisjon av kategorien LC_CTYPEsyntaksfeil i definisjon av ny tegnklassesyntaksfeil i definisjon av nytt tegnkartsyntaksfeil i definisjon av meldingslokalesyntaksfeil i definisjon av monetærlokalesyntaksfeil i definisjon av numerisk lokalesyntaksfeil i sorteringsspesifikasjonsyntaksfeil i prolog: %ssyntaksfeil i ferdeighetskart-definisjon: %ssyntaksfeil i definisjon av tidslokalesyntaksfeil: ikke inne i en lokaledefinisjonmål-innkoding ikke spesifisert med «-t»dette er den første definisjonentid før nullfor stor tidsverdifor få bytes i tegnkodingfor mange tegn i tegnkodingfor mange tegnklasser definertfor mange skuddsekunderfor mange lokale tidstyperfor mange overganger?!for mange vekterfor mange eller for lange tidssoneforkortelseretterfølgende søppel på slutten av linjenproblem med å svare prog %d +-to linjer etter hverandre med «...» er ikke tillattsatte type på bare ett årikke istand til å allokere buffer to inndatakan ikke frigjøre argumenterudefinertukjent tegn «%s»ukjent tegn i felt «%s» i kategori «%s»ukjent sammenligningssnøkkelordukjent nøkkelord «%s»: linje ignorertukjent iconv()-feil %dukjent sett «%s»ukjent symbol «%.*s»: linje ignorertvanskelig soneuavsluttet meldinguavsluttet strenguavsluttet strengkonstantuavsluttet symbolisk navnuavsluttet vektnavnøvre grense i område er ikke mindre enn nedre grensebruk: %s innfil +-bruker 29/2 i ikke-skuddårverdien på %s må være heltallverdien på <%s> må være mellom 1 og 4verdien på felt «%s» i kategori «%s» kan ikke være en tom strengverdien på må være større enn verdien på verdien på feltet «int_curr_symbol» i kategorien LC_MONETARY er ikke gyldig i henhold til ISO 4217verdien på feltet «int_curr_symbol» i kategorien LC_MONETARY har feil lengdeverdien på feltet «%s» i kategorien «%s» må være lavere enn 127under akseptering av forbindelse: %sunder allokering av nærbuffer-innslagunder allokering av hashtabell-innslagunder allokering av nøkkelkopida den gamle katalogfilen ble åpnetda utdata ble forberedtda databasen ble lestunder stat() av profileringsdatafilunder skriving til databasefilskriving ufullstendigskrivbar av andre enn eierfeil antall argumenterfeil antall felt på «Leap»-linjefeil antall felt på «Link»-linjefeil antall felt på «Rule»-linjefeil antall felt på «Zone»-fortsettelseslinjefeil antall felt på «Zone»-linjexdr_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ôKMLEUL&›L(ÂLëLüLM&M5MIMdM~Mn’MOO"%O"HOkO:‡OÂOËOÔOêOPP2PLPePPšP¶PÐPíPQ#Q*Q EQRQYQ3kQ3ŸQ4ÓQ.R%7R]R&qR%˜R¾R%ÕR3ûR,/S)\S†S"ŸS!ÂSäSûST.TDT"ZT*}T¨T&ÂT&éT&U&7U&^U…U U$¾UãUþUV,2V_V%}V,£V-ÐV þV&WFWeW„WžW²WÒW‰òW2|X¯X"ÊX4íX"Y#4Y XY=bY Y<±YîY'Z6Z)?Z(iZ ’Z³ZµZ½Z$ÎZóZ) +-[(4[][ m[y[#[/´[ä[ö[ \ \%\9\ N\Z\j\\ ›\¨\¾\ Õ\ á\ë\ï\ ]&]-<]!j]Œ]ª]È]ß]&ÿ]%&^0L^!}^Ÿ^-·^å^%_)(_'R_%z_& _Ç_ã_ ý_ +-`%`<`X`u`@Ž`DÏ`a'a@a Ua=_aaÇ·ab7žb2Öb- c7c$Jc +-oczc€c!„c¦c·cÐcícdd/dJd^drd3†d-ºd2ède,e5e;jzjƒj‡jšj!®j Ðj!Ýjÿj.kMk ak nk"{kžk±kÄk Úkäk+ük(lElVlmlŠl¤l¼lØlðl +-m1m$Mmrm„mŸm´mÏm çmômn +-n#n*n20ncnrn‹n šn¨nÄnÚnón oo!3oUosos“op*pCp]pnppžp±pÅpÝpópq qq9qVqnq„q,q +-ÊqÕq Üqéqr#r>rXrprr#¢rÆrÖrírs#&sJsjssss s²sÊsÝsæsöst1tPtptt™t¨tÂtÕtôtu*#uNuUumu‰u ™u!£u ÅuÏuéu v"v @vMvavrvƒv v(¾vçvww5wOwew~wŽw w´w½wÓwãw.ów"x 4x#Bx0fx%—x½xÑxçxøx y#y@yOymy„y›yºyØyÝyðyz+zEz_zqzƒzz·zÐzìz! {.{G{b{~{—{µ{"Î{ ñ{þ{ |$|8|J|`|-o|-|!Ë|í|}}2}C}2Z}#} ±}¾};Ò}~$~@~X~ r~ €~¡~¿~Ð~Ö~ð~/J&cŠŸ´½Ü ö€$0€ U€ c€o€…€š€²€º€Ë€߀ô€ *((S |‰"ƒÀD‚K‚$e‚ +-Š‚•‚«¤‚P„ `„n„!‚„¤„³„Ç„å„"ø„…*…@…S…'c…#‹…6¯… æ… +-ô…ÿ…"†"*†M†"g†Š†ª†ĆÛ† ñ†ÿ† ‡‡*‡C‡Z‡o‡‡–‡«‡½‡χ á‡î‡ ˆˆ#%ˆ:Iˆ„ˆšˆ%°ˆÖˆ"숉!‰ @‰"a‰ „‰¥‰¿‰ωá‰æ‰ë‰Š!ŠF>Š …Š.Š-¾Š6ìŠ8#‹;\‹I˜‹â‹ú‹Œ+$Œ+PŒ'|Œ¤Œ ÄŒ ьیùŒ&(.O&~¥,µâŽCŽ#aŽ…Ž¤Ž!ÀŽ"âŽ. 4%U;{&·Þ1þ0 KW"h‹'§Ïç.‘3‘"J‘(m‘-–‘Ä‘Ü‘!ù‘’8’X’t’!’²’Ê’æ’9ý’47“8l“+¥“8Ñ“$ +-”"/”!R”.t”£””á”<•;>•$z•Ÿ•·•*ו7–:–"Y–|–)–N¹–U—^—&|—)£— Í—Û—+ô— ˜>˜X˜j˜"Š˜%­˜*Ó˜*þ˜)™=™0W™ˆ™§™+Ç™7ó™#+šOš!mš$š!´šÖš&ñš%›,>›k›'z›%¢›0È›2ù› ,œ.9œhœKœLÍœLg+{2§2Ú/ ž$=žbž%xž-žž$Ìžñž Ÿ'Ÿ:Ÿ(QŸ&zŸ!¡ŸßFÚŸ! B4 Bw ?º <ú 77¡o¡Š¡#¥¡.É¡0ø¡0)¢Z¢x¢‹¢§¢¼¢Тå¢ÿ¢£%£;£O£#d£5ˆ£G¾£ ¤#¤58¤ n¤{¤-’¤!À¤(â¤- ¥9¥J¥'\¥?„¥=Ä¥ ¦.¦ ?¦9`¦;š¦,Ö¦*§#.§R§%l§A’§Ô§ñ§I¨7X¨3¨+Ĩð¨'©!/©Q©.b©‘©C¤©*è© ªª(8ªaª1tª¦ªÁª:ݪ«)6«*`«#‹«¯«$Ï«ô«¬",¬O¬m¬‡¬¤¬>Ĭ­!"­ D­(e­$Ž­³­*É­=ô­H2®{®Š®Eš®&à®(¯'0¯EX¯ž¯(·¯'à¯$°,-°)Z°%„°ª°"È°ë°& ±0±PO±V ±U÷±OM²V²!ô²'³*>³/i³*™³$ij/é³1´/K´){´*¥´)д#ú´µ-9µ&gµ4Žµ(õìµ ¶ ¶#(¶$L¶"q¶”¶ª¶ĶÛ¶.춷;·3X·Œ·#ž·· Û·å·0ü·-¸$I¸n¸‡¸#˜¸ ¼¸ȸݸñ¸¹)¹4B¹w¹Š¹§¹'ǹBï¹D2ºjwºKâº?.»n»»!ª»Ì»æ»¼¼"3¼V¼r¼ƒ¼¡¼#»¼#ß¼#½0'½#X½|½š½*¸½%ã½& ¾0¿C¿XV¿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Í1tÍ¦Í ¹Í +-ÚÍLåÍ2Î.HÎ#wÎ,›ÎÈÎ7ÐÎ.Ï 7ÏXÏ ZÏdÏ-uÏ£Ï8»Ï.ôÏ#Ð;ÐBÐ&\Ð6ƒÐºÐÎÐäÐ úÐÑÑ<ÑMÑhÑ„Ñ žÑ¬Ñ"ÈÑëÑ +-ûÑÒ" +-Ò-Ò.JÒ4yÒ*®Ò$ÙÒ$þÒ#Ó+<Ó0hÓ>™Ó;ØÓÔ&4Ô/[Ô&‹Ô5²Ô(èÔ,Õ(>Õ9gÕ¡Õ¼ÕÓÕ$ëÕÖ"'Ö"JÖmÖ>ŠÖ=ÉÖ×%×+B× n×=z׸×èÖ×/¿ØEïØ.5Ù+dÙÙ+¥ÙÑÙÚÙàÙäÙÚÚ6ÚSÚ"sÚ–Ú¶ÚÒÚæÚýÚ<Û7UÛ9ÛÇÛ ãÛïÛøÛ' Ü3ÜOJÜ"šÜ,½Ü1êÜÝ!1Ý4SÝ=ˆÝÆÝâÝ Þ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ð3Eð yðšð!¹ðÛðøðñ 'ñHñcñ~ññŸñ ³ñ½ñÛñïñ8ò 9òFò+Wò)ƒò*­òØòõòó%óCó'`óˆó"—óºóÏó#èó$ ô1ô9ôBôaôô—ô¯ôÄôÓôíôõ"(õ$Kõpõõ¨õÃõâõ ûõö*:ö eö"qö”ö«öÅöØöïö6ÿö56÷ l÷"÷°÷ Ð÷ñ÷ ø11ø9cø ø$«øMÐøù:ùXùrù’ùªù-Æùôù +-úú-úHúhúúŸú%»úáúøú û-ûDû0`û‘û'­û Õû +-âûíû +-ü"ü +-6üAüUüpü Œü­üÌü$Óü0øü)ý8ý7Oýh‡ýðýùý+þ +-?þJþŽbþ ñÿÿÿ =L#e‰(šÃØõ!ABa¤ +-³¾-Ç-õ/#7S‹#«Ïæ ú %5+Nz£»Ðæü"= O&YD€ÅÚ.ï":]%l&’#¹)Ý &2INS0j›>³ ò7ü94;n7ª<âE"eˆ¤*¹*ä% 5 T d } š µ /Î 2þ ,1 +-^ +-:s +-A® +-Eð +-K6 ,‚ 2¯ 1â 3 3H =| 1º 2ì H 5h -ž =Ì 2 +-=V3t*¨2Ó**1=\$š5¿+õA!(c,Œ/¹(é00C6t4«$à'.-:\.—3Æ+ú:&'a)‰(³2Ü-K@j@«%ì#,-PL~"Ë'î,'RTZ§&&)"Ps.ª!Ùû #!#E'i.‘3Àô,$,Q1~<°Cí.11`/’#Â4æ*&F!m0À0Ï0/1Da¦'¼äKûJGH’Û-ó;!1].6¾õ#**UuŠ¤º.Ð)ÿ$) N Hf ¯ Gà D !@P!?‘!BÑ!"/"*M"3x"5¬"5â"#7#V#r##©#Æ#Þ#ô# $*$B$*_$0Š$A»$ý$( %65%l%{%6š%.Ñ%6&37&k&…&- &<Î&: 'F'.X'&‡'=®'Aì'5.(.d()“((½(3æ(H))c))T¨):ý).8*:g*¢*)º*$ä* +="+`+:|+,·+ ä+ò+/ ,;,.M,)|,(¦,CÏ,-(1-)Z-+„-%°-,Ö-..*<.!g.‰.¤.¿.5Ü.#/*6/,a//Ž/*¾/é/9þ/C806|0³0Ç0GÛ0&#1J1f1D‚1Ç17Ý1/2#E24i28ž2$×2ü203J3.g3–3b´3d4c|4aà4mB5"°5*Ó5&þ5+%61Q6&ƒ6.ª6.Ù6-7167+h70”7)Å7ï7/ 8*=88h8&¡8È8Þ8ï89!9#?9c999 ±9-½9ë9(:5+:a:;w:&³:Ú:ê:(ý:&;*C;n;‡;)œ;Æ;×;ï;<<9<1R<„<!š<$¼<&á<@=>I=]ˆ=Iæ=>0>#o>/“>.Ã>ò>#?5?U?-k?™?¸?'Ð?ø?@*@F@'b@Š@¦@Ã@@à@4!AÙkÝß@,Œ(Èø:CØ÷p}Õë2ÑëkD†!aSqäJw7ºý@„EVH¿sèlsŠu[¢vË©á: ã6=u‚ño.£ |dãpÔ9™$–[¥l?úC`ŒŒ‡*€X9IÊSVp!Ò…ydá‡þ£בQò1õÂn^ +- m4·¨?îm³rŠþ]„ý‚Ì#´/_JÄœsfQ8årÍz•ƒ<ÖxB{Kˆå>÷DM¢œùÓ>·ÇoiÃ@xµûb ¶ga„Eoe-xWØ؃ZsR"ˆ4/îÁ*Û(äÇ…1 kLVÌN)²‰Ay¹*íf$XQ)#K¤ûÕ[qDáè½TaÄ.ÜùT,'ûu\àê!3ë‹g +-=H]Ó-5Oz»ßj«¬Ú ƒõôïí¿®Á”.¯ø†G’jJZ„R™›C¯3ÿÆ%e`«Ô¡ÉUm{QcP˜«¾òÀƺ6rÍ`ÿ³tôe5‹Fh|›§ìbܱ²ÈeÙ\~2E j¼#š þmÅy ¶1Mö\»4fR ¨×7YŠfL˜FΠª ‰<È¥  Ú’³{iYÏãç÷ %ÿ§(cŽÒ~,Ÿ{é‚ ñC5"Ñ?Ðv)…? +-+/~_"}W|ÛÉdµ¡O"=™R¤Lݽ@uÄ7^ý®8P‡Ãªy` <w}_¨'HdÑnš®ïH”GŽ5>+SÕ-Ý­Yú!©¾Iõgl¼^zßÒvžÞ¹öͤNA|ôtWÏ·+ðƒ$3h̪cèŒb&A´ib[ ¦8Û“ÞOàÔo×Y#róN0——í;n°Ü%‚ñó¼Ëžð E K +-M꿬âh¬XTt ¾^ü9‹M J”âµ>+Š(ì2c±‘6&£œV)†ü›¡¦úU=B•“º;véÊì0Ë€ZüÊï%ɯâ½~]ಘð1¶Np2i':0-DÅ°¸S­ÚÖWL8Óꦟî}¹ç,ø°¸Ðtäö&‘Bw†ælÏIæó‹å6'“ÎçUÙ‰À:*øF‰»– n.…q7éx/Þw;ŸÇž’À&§´G;TZF©g4ˆqò_OKP\–Æ—X•IzÅÂÁ‡G0aAˆBæjUù­€€š<$Ðk¥¢ÎÖ]PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Polish +-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: %sLinia "Zone %s" i opcja -l wykluczaj± siê wzajemnieLinia "Zone %s" i opcja -p wykluczaj± siê wzajemnieflagi 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: musi byæ wiêkszy ni¿ +-%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³uznak nie mo¿e znajdowaæ siê w klasie `%s'znak nie jest w klasie `%s'?PrzerwanePrawa dostêpu : Próba u¿ycia uszkodzonej biblioteki dzielonejAdres jest ju¿ w u¿yciuRodzina adresów dla tej nazwy hosta nie jest obs³ugiwanaRodzina adresów nie obs³ugiwana przez protokó³B³±d podczas og³aszaniaBudzikLista argumentów za d³ugaPróba skasowania tablicy z zawarto¶ci±Próba ³±czenia ze zbyt wieloma bibliotekami dzielonymiUwierzytelnienie OKB³±d uwierzytelnieniaNIEISTNIEJ¡CY OBIEKT +-B³êdny adresB³êdny deskryptor plikuB³êdny format pliku czcionekB³êdny komunikatB³êdne wywo³anie systemoweB³êdna warto¶æ dla ai_flagsPrzestrzegaj ¶ci¶le POSIXDane binarne +-Wymagane urz±dzenie blokoweProblem podczas próby rozg³aszaniaPrzerwany potokB³±d szynyCDSPrzekroczony limit czasu procesoraDezaktualizacja bufora cacheBrak dostêpu do wymaganej biblioteki dzielonejPo³±czenie z serwerem dla tej domeny jest niemo¿liweKomunikacja z portmapperem jest niemo¿liwaKomunikacja z ypbind jest niemo¿liwaKomunikacja z ypserv jest niemo¿liwaBrak pamiêci do alokacjiPrzypisanie ¿±danego adresu jest niemo¿liweStworzenie gniazda dla transmisji rpc niemo¿liweBezpo¶rednie uruchomienie biblioteki dzielonej jest niemo¿liweNie mo¿na podaæ wiêcej ni¿ jednej flagi generowania pliku! +-Brak odpowiedzi na rozg³aszanieZarejestrowanie us³ugi jest niemo¿liweWysy³anie po zamkniêciu gniazda jest niemo¿liweWys³anie pakietu transmisji niemo¿liweUstawienie opcji gniazda SO_BROADCAST jest niemo¿liweMo¿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 zakresemSeparator znaków : %c +-Potomek zakoñczy³ pracêWierzytelno¶æ klienta jest zbyt ma³aKolmny : +-B³±d komunikacji podczas wysy³aniaSkompiluj specyfikacjê lokalizacjiKomputer wyjecha³ na wakacjeObliczanie rozmiaru tablicy klas znaków mo¿e chwilê potrwaæ...Obliczanie rozmiaru tablicy sortowania mo¿e chwilê potrwaæ...Po³±czenie odrzuconePo³±czenie zerwane przez drug± stronêPrzekroczony czas oczekiwania na po³±czenieKontynuacjaKonwertuje podanych plików miêdzy ró¿nymi metodami kodowania.Konwertuj klucz na ma³e znakiCopyright (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¿liweTworzy plik nag³ówkowy C o nazwie NAZWA zawieraj±cy definicje symbolibrak pliku wyj¶ciowego - wyst±pi³y ostrze¿eniaTworzy prost± bazê DB z wej¶cia tekstowego.Czas stworzenia : %sPozycja DES dla sieci %s nie jest unikalna +-KATALOG +-DNANSDNSBrak bazy danych dla tej tabeliBaza danych jest zajêtaDomy¶lne prawa dostêpu : +-Wymagany jest adres docelowyUrz±dzenie nie jest strumieniemUrz±dzenie nie jest skonfigurowaneUrz±dzenie lub zasoby s± zajêteDiffie-Hellmann (%d bitów) +-Katalog : %s +-Katalog nie jest pustyPrzekroczony limit dyskowyNie pracuje w tle i wy¶wietla komunikaty na bie¿±cy terminalNie wy¶wietla komunikatów podczas budowania bazy danychZamiast do istniej±cego katalogu zapisuje do nowego plikuDomena nie zosta³a zwi±zanapu³apka EMTPOZYCJA +-Zaszyfrowane dane +-Typy wpisu/tablicy nie pasuj± do siebieB³±d w podsystemie RPMZnalezienie 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 callbackaB³±d: plik .netrc mo¿e byæ czytany przez ka¿dego.Przepe³niona wymianaB³êdny format pliku wykonywalnegoPRZERWANIE: system nie definiuje `_POSIX2_LOCALEDEF'PLIK zawiera odwzorowania nazw symbolicznych na warto¶ci UCS4Nieudane (nieustalony b³±d)Deskryptor pliku w z³ym staniePlik istniejePodczas blokowania pliku wyst±pi³o zakleszczenieZa d³uga nazwa plikuPrzekroczony limit wielko¶ci plikuPlik jest za du¿y£añcuch pierwszy/nastêpny jest uszkodzonyB³±d w obliczeniach zmiennoprzecinkowychKatalog wymaga powtórzenia pe³nej synchronizacjiNiezaimplementowana funkcjaGRUPA +-B³êdne dane w ARGP_HELP_FMT: %sGeneruje 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 systemowyWy¶wietla dane dotycz±ce lokalizacji.Wy¶wietla krótkie informacje o sk³adni poleceniaWy¶wietla ten tekst pomocyNieoczekiwany b³±dGrupa : %s +-Flagi grupy :Wpis dla grupy "%s.%s": +-Czekaj przez SEK sekund (domy¶lnie 3600)Roz³±czenieNie 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 odpowiadaOdnalezienie nazwy hosta jest niemo¿liweWe/Wy dozwolonePLIK-WE PLIK-WY +--o PLIK-WY PLIK-WE +--u PLIK-WEpu³apka IOTIVYIdentyfikator zosta³ usuniêtyB³êdna instrukcjaB³êdny typ obiektu dla tej operacjiB³êdne przesuniêcieNiew³a¶ciwy typ lub format plikuNiew³a¶ciwy dostêp do urz±dzeniaDzia³anie niedopuszczalne dla procesu w tle¯±danie informacjiInformacja:Pliki wej¶ciowe:Specyfikacja formatu wej¶cia/wyj¶cia:B³±d wej¶cia/wyj¶ciaB³±d wewnêtrzny NISB³±d wewnêtrzny ypbindPrzerwaniePrzerwane wywo³anie systemoweNale¿y wznowiæ przerwane wywo³anie systemoweB³êdny obiekt dla tej operacjiZ³y argumentB³êdny odno¶nik wsteczB³êdna nazwa klasy znakuB³êdne uwierzytelnienie klientaB³êdny weryfikator klientaB³êdny znak sortowanyB³êdna zawarto¶æ \{\}B³êdne dowi±zanie miêdzy urz±dzeniamiB³êdna wymianaB³êdny lub niepe³ny znak wielobajtowyB³êdne poprzedzaj±ce wyra¿enie regularneB³êdny koniec zakresuB³êdne wyra¿enie regularneZ³y kod ¿±daniaB³êdny deskryptor ¿±daniaB³êdny weryfikator serweraB³êdny kana³Jest katalogiemJest plikiem nazwanymKerberos. +-UnicestwionyDOWI¡ZANIE +-Wpis LOKALNY dla UID %d w katalogu %s nie jest unikalny +-Poziom 2 zatrzymanyPoziom 2 brak synchronizacjiPoziom 3 zatrzymanyPoziom 3 wyzerowanyDowi±zanie wskazuje na b³êdn± nazwêPo³±czenie zosta³o przerwaneNumer dowi±zania poza zakresemTyp dowi±zanego obiektu : Dowi±zany do : %s +-Lokalna domena nie jest ustawionaWyst±pi³ b³±d podczas przydzielania lokalnych zasobówMaszyna nie znajduje siê w tej sieciZniekszta³cona lub b³êdna nazwaArgumenty 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êciPamiêæ wyczerpanaKomunikat za d³ugiBrakuj±cy lub b³êdny atrybutModyfikacja : %sModyfikacja nie powiod³a siêOperacja modyfikacji nie powiod³a siêModyfikuje format wyj¶ciowy:Próba przej¶cia przez zbyt wiele ruterówNAZWANAZWA +-[-a|-m]NISNiezgodno¶æ wersji miêdzy klientem i serwerem NIS - us³uga niemo¿liwaMapa NIS zawiera b³êdyOperacja NIS+ nie powiod³a siêSerwery NIS+ s± niedostêpneUs³uga NIS+ jest niedostêpna lub nie zosta³a zainstalowanaBRAK OBIEKTU +-LICZBANazwa : '%s' +-Demon buforuj±cy us³ugi odwzorowania nazw.Nazwa nie jest obs³ugiwana przez ten serwerNazwa nie jest unikalna w sieciTa nazwa lub us³uga jest nieznanaNazwa/zapis nie jest unikalnyWskazany obiekt nie mo¿e byæ przeszukiwanyWymagane uwierzytelnienieSieæ przerwa³a po³±czenie po resecieSieæ nie dzia³aSieæ jest niedostêpnaStruktura CSI niedostêpnaBrak dostêpnych semaforów XENIXowychBrak adresu zwi±zanego z nazw± hostaBrak adresu zwi±zanego z nazw±Brak anodyBrak miejsca w buforzeBrak procesów potomnychBrak danychBrak miejsca na serwerzeBrak dostêpnych blokadNic nie pasujeBrak mediumBrak komunikatu o po¿±danym typieNie ma wiêcej rekordów w mapieBrak wyra¿enia regularnegoBrak zarejestrowanych zdalnych programów. +-Brak drogi do systemuBrak miejsca na urz±dzeniuNie ma takiego urz±dzeniaNie ma takiego pliku ani kataloguBrak takiego klucza w mapieNie ma takiej mapy w domenie serweraNie ma takiego procesuNapotkano nazwy nie nale¿±ce do przestrzeni NIS+Wyst±pi³ krytyczny b³±d w odwzorowaniu nazwBrak. +-Nie znaleziono, brak takiej nazwyTo nie jest nazwanego pliku w wersji XENIXaTo nie jest katalogNie znalezionoTo nie jest serwer nadrzêdny dla tej domenyTo nie jest w³a¶cicielLiczba kolumn : %d +-L. obiektów : %u +-Argument numeryczny poza zakresemWynik numeryczny poza zakresemObiekt #%d: +-Nazwa obiektu : %s +-Typ obiektu : Zdalny obiekt jest obiektem podmontowanym przez NFSIstnieje ju¿ obiekt o tej nazwieNieparzysta liczba cudzys³owówTylko root mo¿e u¿ywaæ tej opcji!Operacja jest ju¿ wykonywanaOperacja niedozwolonaOperacja nie obs³ugiwanaOperacja jest w³a¶nie wykonywanaOperacja spowoduje blokadêBrak dodatkowych strumieniKontrola wyj¶cia:Wybór wyj¶cia:W³a¶ciciel : %s +-PRYWATNY +-Pakiet nie jest zainstalowanyB³±d parsowania: %sCzê¶ciowy sukcesUzyskany obiekt nie jest taki sam jak obiekt na serwerzeBrak dostêpuAwaria zasilaniaNiespodziewany koniec wyra¿enia regularnegoWy¶wietla rekordy bazy linijka po linijceWy¶wietla aktualne statystyki konfiguracjiWy¶wietla wiêcej komunikatówWy¶wietla wersjê programuPrawdopodobnie sukcesPrawdopodobnie nie znalezionyKoniec stopera profiluj±cegoSterownik protoko³u nie jest pod³±czonyB³±d protoko³uNie obs³ugiwana rodzina protoko³ówProtokó³ niedostêpnyProtokó³ nie obs³ugiwanyTyp protoko³u nie pasuje do gniazdaB³êdne zapytanie dla podanej tablicyWyj¶cieB³±d RFSRPC z³a procedura dla programuB³±d RPC podczas operacji NISRPC program niedostêpnyRPC z³a wersja programuRPC b³êdna strukturaRPC z³a wersjaRPC: (nieznany kod b³êdu)RPC: B³±d uwierzytelnianiaRPC: Nie mogê zdekodowaæ wynikuRPC: Nie mogê zakodowaæ argumentówRPC: Nieudane (niesprecyzowany b³±d)RPC: Niekompatybilne wersje RPCRPC: Awaria portmapperaRPC: Niedostêpna proceduraRPC: Niezarejestrowany programRPC: Niedostêpny programRPC: Niezgodno¶æ programu/wersjiRPC: B³±d w odleg³ym systemieRPC: Serwer nie mo¿e zdekodowaæ argumentówRPC: SukcesRPC: Czas oczekiwania przekroczonyRPC: Niemo¿liwy odbiórRPC: Niemo¿liwe wysy³anieRPC: Nieznany hostRCP: Nieznany protokó³RSA (%d bitów) +-RTLD_NEXT wyst±pi³o w kodzie nie ³adowanym dynamicznieCzyta i wy¶wietla dane profiluj±ce obiektu dzielonegoCzyta konfiguracjê z pliku NAZWASystem plików wy³±cznie do odczytuSygna³ w czasie rzeczywistym %dWyra¿enie regularne jest za du¿eB³±d we/wy w odleg³ym systemieZmieni³ siê adres drugiego koñcaUsuñ has³o lub uczyñ plik niedostêpnym dla innychNie 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 . +-Argumenty ¿±dania s± b³êdneB³±d 0 resolvera (bez b³êdów)B³±d wewnêtrzny resolveraUnikniêto zakleszczenia zasobówZasoby zosta³y straconeZasoby chwilowo niedostêpneWyniki zosta³y wys³ane do procedury callbackaOBJ_DZIEL [DANE_PROF]SUNYP¦cie¿ka przeszukiwania : %s +-Naruszenie ochrony pamiêciSerwer zajêty, spróbuj ponownieBrak pamiêci dla serweraSerwer odrzuci³ wierzytelno¶æSerwer odrzuci³ weryfikacjêNazwa nie obs³ugiwana dla ai_socktypeOkre¶la nazwê programuKoñczy pracê serweraSygna³ 0Operacja na obiekcie, który nie jest gniazdemNie obs³ugiwany typ gniazdaOprogramowanie spowodowa³o przerwanie po³±czeniaNiestety nie jeste¶ rootem +-Definicje ¼ród³owe znajduj± siê w PLIKUB³±d srmountB³±d stosuNieaktualny uchwyt pliku NFSUruchamia LICZBÊ w±tkówStan : %s +-ZatrzymanyZatrzymany (sygna³)Zatrzymany (wej¶cie z tty)Zatrzymany (wyj¶cie na tty)B³±d potoku biblioteki strumieniStruktura wymaga wyczyszczeniaSukcesNie wy¶wietla ostrze¿eñ i informacjiNazwy symboliczne znaków s± zdefiniowane w PLIKUB³±d systemowyInformacja o systemie:Wyst±pi³ b³±d podczas przydzielania zasobów systemowychKatalog systemowy map znaków : %s +- map repertuarów : %s +- ¶cie¿ka lokalizacji: %s +-%sTABLICA +-Typ tablicy : %s +-Odwzorowanie nazwy jest chwilowo niemo¿liweZakoñczonyPlik wykonywalny zajêtyPoni¿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 stoperaZa du¿o atrybutówZa du¿o wzajemnych symlinkówZa du¿o linkówZa du¿o otwartych plikówZa du¿o otwartych plików w systemieZa du¿o procesówZa du¿o odniesieñ: dowi±zanie niemo¿liweZa du¿o u¿ytkownikówPu³apka debuggera/breakpointKoñcz±cy znak `\'Translator przerwa³ pracêDrugi koniec jest ju¿ po³±czonyDrugi koniec nie jest po³±czonyNapisz `%s --help' lub `%s --usage' by uzyskaæ wiêcej informacji. +-Próbujê %s... +-Typ : %s +-NIEZNANYUwierzytelnienie klienta NIS+ jest niemo¿liweUwierzytelnienie serwera NIS+ jest niemo¿liweUtworzenie procedury callbacka nie jest mo¿liweUruchomienie nowego procesu na serwerze jest niemo¿liweNieznany (typ = %d, bity = %d) +-Nieznane s³owo kluczowe w .netrc %sNieznany kod b³êdu NISNieznana baza `%s' +-Nieznany b³±dNieznany b³±d Nieznany hostNieznany obiektNieznana opcja: %s %s %sNieznany b³±d biblioteki odwzoruj±cej nazwyNieznany b³±d serweraNieznany sygna³ %dNieznany b³±d systemowyNieznany b³±d ypbindNiesparowane ( lub \(Niesparowane ) lub \)Niesparowane [ lub [^Niesparowane \{Nierozpoznana zmienna `%s'Nag³y wypadek I/OSk³adnia:Sk³adnia: %s nazwa_zmiennej [¶cie¿ka] +-Sk³adnia: rpcinfo [ -n nr_portu ] -u host nr_programu [ nr_wersji ] +-Sygna³ u¿ytkownika 1Sygna³ u¿ytkownika 2Warto¶æ za du¿a dla zdefiniowanego typu danychWirtualny stoper wyczerpanyOsobliwy wynik wykonania poleceniaOkno zmienioneWy¶wietla nazwy dostêpnych map znakówWy¶wietla nazwy dostêpnych lokalizacjiWy¶wietla nazwy wybranych kategoriiWy¶wietla nazwy wybranych s³ów kluczowychZapisuje wyniki do pliku NAZWAAutor: %s. +-Niew³a¶ciwy typ mediumX500XCHSYPBINDPROC_DOMAIN: %s +-Tak, 42 jest odpowiedzi± na pytanie o sens ¿yciaTym 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 znakNie obs³ugiwana rodzina protoko³ówNie obs³ugiwany typ gniazdajest ju¿ uruchomionyargument <%s> musi byæ pojedynczym znakiemargument `%s' musi byæ pojedynczym znakiemauth_none.c - Problem z prze³±czaniemauthunix_create: brak pamiêci +-b³êdny argumentnieodpowiedni w³a¶cicielpuste pole FROM w linii Linkpuste pole TO w linii Linkblok 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 buforacache_set: przydzielenie nowego rpc_buffer jest niemo¿liwecache_set: przydzielenie pamiêci dla nowego wpisu jest niemo¿liwecache_set: nie znaleziono wpisu mo¿liwego do powtórnego wykorzystaniaokre¶lenie skrótu strefy czasowej po koñcu przedzia³u czasu jest niemo¿liweprzypisanie procedury nr %d jest niemo¿liwe +-znalezienie pliku lokalizacji `%s' jest niemo¿liweprzydzielenie pamiêci dla symboli jest niemo¿liwestworzenie wewnêtrznego deskryptora jest niemo¿liwestworzenie wewnêtrznego deskryptora jest niemo¿liweotwarcie gniazda do przyjmowania po³±czeñ jest niemo¿liwe: %sodnalezienie 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 %dwstawienie elementu sortowania `%.*s' jest niemo¿liwewstawienie do tablicy wyników jest niemo¿liwewstawienie definicji nowego symbolu sortowania niemo¿liwe: %sza³adowanie danych do profilowania jest niemo¿liweotwarcie jest niemo¿liweotwarcie `%s' jest niemo¿liweotwarcie pliku bazy danych `%s' jest niemo¿liwe: %sotwarcie wej¶ciowego pliku `%s' niemo¿liweotwarcie pliku definicji lokalnych `%s' niemo¿liweotwarcie wyj¶ciowego pliku jest niemo¿liweotwarcie wyj¶ciowego pliku `%s' niemo¿liweotwarcie wyj¶ciowego pliku `%s' dla kategorii `%s' niemo¿liweotwarcie gniazda jest niemo¿liwe: %sprzetwarzanie specyfikacji kolejno¶ci jest niemo¿liweodczyt katalogu mapy znaków `%s' niemo¿liwyprzeczytanie pliku konfiguracyjnego jest niemo¿liwe: koniec pracyodczyt danych od klienta jest niemo¿liwyprzeczytanie nag³ówka z `%s' jest niemo¿liweodczyt katalogu lokalizacji %s' jest niemo¿liwyodczyt pliku lokalizacji `%s' niemo¿liwyodczytanie mapy repertuarów `%s' jest niemo¿liweodczytanie danych statystycznych jest niemo¿liweznalezienie pliku bazy danych `%s' jest niemo¿liwe: %szapisanie plików wyj¶ciowych do `%s' jest niemo¿liwezapisanie wyniku jest niemo¿liwe: %szapisanie statystyk jest niemo¿liwe: %szwracanie odpowiedzi klientowi jest niemo¿liwewielokrotne ¿±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 nie zdefiniowany w tablicy znakówznak `%s', wymagany jako domy¶lny, nie zosta³ zdefiniowanyklasa znaków `%s' jest ju¿ zdefiniowanatablica znaków `%s' jest ju¿ zdefiniowananie 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êtaelement sortowania `%.*s' wyst±pi³ wielokrotnie: linia pominiêtaoczekiwano symbolu sortowania po `%s'po³±czenie do adresu %s: spodziewana sta³a lub identyfikatorkonwersja z `%s' do `%s' nie jest obs³ugiwanakonwersja zosta³a przerwana poniewa¿ wyst±pi³y problemy z zapisaniem wynikówstworzenie 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 znakiemdwukrotne wyst±pienie nazwy znaku `%s'podwójna definicja elementu sortowaniawielokrotna definicja znaku `%.*s'dwukrotne wyst±pienie kluczapodwójna definicja zbiorupodwójna nazwa strefy %s (plik "%s", linia %d)podwójny identyfikator komunikatupodwójny numer komunikatupusty napispusta nazwa wagi: linia zignorowanaenablecache: bufor jest ju¿ aktywnyenablecache: niemo¿liwa alokacja buforaenablecache: niemo¿liwa alokacja danych buforaenablecache: niemo¿liwa alokacja kolejki dla buforakodowanie wynikówkodowanie oryginalnego tekstukoniec zakresu wyrzutni wiêkszy niz pocz±tekwyst±pi³ b³±d podczas zamykania wej¶cia `%s'wyst±pi³ b³±d podczas zamykania pliku wyj¶ciowegowyst±pi³ b³±d podczas zamykania pliku z danymi profiluj±cymib³±d podczas wstawiania elementu sortowanego do tablicy mieszaj±cejb³±d podczas wstawiania do tablicy mieszaj±cejwyst±pi³ b³±d podczas czytania danych wej¶ciowychspodziewanym argumentem dla `copy' jest ³añcuchbrak spodziewanej linii kontynuacjiNie powiod³o siê za³adowanie dzielonego obiektu `%s'Nie uda³o siê za³adowaæ danych o symbolachNie uda³ siê mmap danych profiluj±cychNie uda³o siê rozpocz±æ konwersjiniepowodzenie przy zapisie danych kategorii `%s'fcntl: F_SETFDpole `%s' w kategorii `%s' nie jest zdefiniowanepole `%s' w kategorii `%s' nie jest zdefiniowaneplik '%s' ju¿ istnieje i mo¿e zostaæ nadpisany +-argument from-value definicji `collating-element' musi byæ ³añcuchemfstat 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 czasamiget_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 symlinkagdzie¶ dowi±zanyb³êdne pole CORRECTION w linii Leapb³êdne ple Rolling/Stationary w linii Leapb³êdna sta³a znakowa w ³añcuchub³êdn znak w pliku: b³êdny element sortowanianiepoprawna definicjaniepoprawne kodowanieniepoprawna sekwencja escape na koñcu ³añcuchab³êdna sekwencja wej¶ciowa na pozycji %ldniepoprawne nazwy dla zakresu znakówb³êdny typ sieci :'%s' +-nieprawid³owa warto¶æ offset w ³añcuchu %d w polu `era' w kategorii `%s'b³êdny numer zbiorunieprawid³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ówograniczenie implementacji: dozwolone maksymalnie %d map znakówna koñcu bufora wyst±pi³ niekompletny znak lub sekwencja steruj±canieprawid³owy format plikunieznany typ linii wej¶ciowejb³±d wewnêtrzny (nieprawid³owy deskryptor)b³±d wewnêtrzny - addtype wywo³ane ze b³êdnym isdstb³±d wewnêtrzny - addtype wywo³ane ze b³êdnym ttisgmtb³±d wewnêtrzny - addtype wywo³ane ze b³êdnym ttisstdb³±d wewnêtrzny w %s, linia %unieprawid³owe przesuniêcie UTCnieprawid³owy format skrótunieprawid³owy dzieñ miesi±canieprawid³owy rok koñcowynieprawid³owy rok przestêpnyb³êdny typ dla dlopen()nieprawid³owy miesi±cb³êdny czas oszczêdno¶cinieprawid³owy rok pocz±tkowynieprawid³owa pora dnianieprawid³owy dzieñ tygodniad³ugo¶æ klucza w ¿±daniu jest za du¿a: %Zdlinia za wyrzutni± musi zawieraæ definicjê znakulinia przed wyrzutni± nie mo¿e zawieraæ definicji sta³ej znakowejza d³uga liniawy¶wietla wszystkie znane zestawy znakówbrak pliku lokalizacji `%s' u¿ytego w wyra¿eniu `copy'nieudany lstatb³êdna linia zosta³a pominiêtanie powiod³o siê odwzorowanie tablicy nag³ówków sekcjinie powiod³o siê odwzorowanie nag³ówków sekcjipamiêæ zosta³a uszkodzona przed przydzielonym blokiem +-pamiêæ zosta³a uszkodzona za przydzielonym blokiem +-pamiêæ zosta³a wyczerpanapamiêæ 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³anie podano kodowania ¼ród³owego ani docelowegonetname2user: (odwzorowanie nis+): %s +-netname2user: wpis DES dla %s w katalogu %s nie jest unikalnynetname2user: wpis LOKALNY dla %s w katalogu %s nie jest unikalnynetname2user: brak listy identyfikatorów grup w '%s'.name2user: nazwa nadzorcy '%s' jest zbyt d³uganetname2user: UID 0 nie powinien wyst±piæprogram %d nie by³ nigdy zarejestrowany +-nie podano ¿adnych warto¶ci lub brak poprawnego wyra¿enia regularnego dla pola `%s' w kategorii `%s': %s¿aden z dni miesi±ca nie pasuje do regu³ybrak 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¿enianie podano ¿adnej mapy repertuarów: kontynuacja niemo¿liwabrak nazwy symbolicznejbrak nazwy symbolicznej dla koñca zakresubrak definicji wagi dla symbolu `%s'nie jest zwyk³ym plikiemkonfiguracja nscd: +- +-%15d poziom komunikatów diagnostycznych +-nscd nie jest uruchomiony! +-po definicji CHARMAP mog± wystêpowaæ tylko definicje WIDTHnie podano kodowania ¼ród³owego w opcji `-f'plik wynikowyproblem rpc pmap_getmapspoll: b³±d protoko³u podczas zestawiania pêtli +-b³±d preprocesorawy¶wietla listê ¶cie¿ek zliczania i ich numerywy¶wietla informacje o postêpie konwersjiwyst±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êpnenie 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¿liwyta sama nazwa nazwa regu³y w ró¿nych plikachbrak danych podczas czytania klucza ¿±dania: %sbrak danych podczas czytania ¿±dania: `%s'b³±d zapisu w %s: %ssocket: protokó³ zawiód³ podczas konfiguracji po³±czenia +-porz±dki sortowania `forward' i `backward' wykluczaj± siê wzajemniespecyfikacja wagi dla elementu sortowania nie ma sensustandardowe wej¶ciestandardowe wyj¶cienieprawid³owa pierwsza data w ³añcuchu %d w polu `era' w kategorii `%s'pierwszy rok jest pó¼niejszy ni¿ drugipierwszy rok jest zbyt du¿ypierwszy rok jest zbyt ma³ynieprawid³owa druga data w ³añcuchu %d w polu `era' w kategorii `%s'svc_run - b³±d selectsvc_tcp.c - wykonanie getsockname lub listen niemo¿liwesvc_tcp.c - problemy przy tworzeniu gniazda tcpsvc_tcp: makefd_xprt: brak pamiêci +-svc_unix.c - problemy przy tworzeniu gniazda AF_UNIXsvc_unix.c - wykonanie getsockname lub listen niemo¿liwesvc_unix: makefd_xprt: brak pamiêci +-svctcp_create: brak pamiêci +-svcudp_create - wykonanie getsockname niemo¿liwesvcudp_create: brak pamiêci +-svcudp_create: problemy przy tworzeniu gniazdasvcunix_create: brak pamiêci +-symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicjê tego elementusymbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicjê innego elementusymbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicjê innego symbolusymbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicjê tego symbolusymbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela nazwê symboliczn± z zestawu znakówb³±d sk³adniowy w definicji %s: %sb³±d sk³adniowy w dyrektywie `order_start'b³±d sk³adniowy definicji klasy znakówb³±d sk³adniowy w definicji konwersji znakub³±d sk³adniowy w definicji kolejno¶ci sortowaniab³±d sk³adniowy w definicji sortowaniab³±d sk³adniowy w definicji kategorii LC_CTYPEb³±d sk³adniowy w definicji nowej klasy znakówb³±d sk³adniowy w definicji nowej mapy znakówb³±d sk³adniowy w definicji lokalnych komunikatówb³±d sk³adniowy w definicji lokalnej walutyb³±d sk³adniowy w lokalnej definicji numerycznejb³±d sk³adniowy w specyfikacji kolejno¶cib³±d sk³adniowy w prologu: %sb³±d sk³adniowy w definicji mapy repertuaru: %sb³±d sk³adniowy w lokalnej definicji czasub³±d sk³adniowy: nie wewn±trz sekcji definicji lokalnychnie podano docelowego kodowania w `-t'to pierwsza definicjaczas przed zeremprzepe³nienie czasuza ma³o bajtów w kodzie znakuza du¿o bajtów w kodzie znakuzdefiniowane zbyt wiele klas znakówza du¿o sekund przestêpnychza du¿o lokalnych typów czasuza duzo konwersji?!za du¿o wagza d³ugie lub za du¿o skrótów stref czasowych¶miecie na koñcu liniiproblem przy odpowiadaniu programowi %d +-dwie kolejne linie zawieraj±ce `...' nie s± dozwolonepodany pojedyñczy rokprzydzielenie bufora dla danych wej¶ciowych by³o niemo¿liwezwolnienie argumentów nie powiod³o siêniezdefiniowananieznany znak `%s'nieznany znak w polu `%s' kategorii `%s'nieznana dyrektywa sortuj±canieznana dyrektywa `%s': linia zignorowananieznany b³±d iconv() %dnieznany zestaw `%s'nieznany symbol `%.*s': linia zignorowanastrefa bez regu³niezakoñczony komunikatniezakoñczony ³añcuchniezakoñczony napisniezakoñczona nazwa symbolicznaniezakoñczona nazwa wagigórna granica zakresu nie jest mniejsza ni¿ dolnask³adnia: %s plik_we +-u¿ycie 2/29 w roku nieprzestêpnymwarto¶æ %s musi byæ liczb± ca³kowit±warto¶æ <%s> musi byæ z zakresu 1 do 4warto¶æ pola `%s' w kategorii `%s' nie mo¿e byæ pustym ³añcuchemwarto¶æ musi byæ wiêksza ni¿ warto¶æ zawarto¶æ pola `int_curr_symbol' w kategorii `LC_MONETARY' nie jest zgodna z nazwami ISO 4217zawarto¶æ pola `int_curr_symbol' w kategorii `LC_MONETARY' ma z³± d³ugo¶æwarto¶ci pola `%s' w kategorii `%s' musz± byæ mniejsze ni¿ 127podczas przyjmowania po³±czenia: %spodczas dokonywania wpisu do pamiêci podrêcznejb³±d podczas wstawiania do tablicy mieszaj±cejpodczas tworzenia kopii kluczapodczas otwierania starego katalogupodczas przygotowywania wynikówpodczas czytania bazypodczas szukania pliku z danymi profiluj±cymipodczas zapisywania pliku bazyzapis nie by³ kompletnyzapisywalny nie tylko przez w³a¶cicielaz³a liczba argumentówz³a liczba pól w linii Leapz³a liczba pól w linii Linkz³a liczba pól w linii Rulez³a liczba pól w linii kontynuacji Zonez³a liczba pól w linii Zonexdr_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ôKMLEUL&›L(ÂLëLüLM&M5MIMdM~Mn’MOO"%O"HOkO:‡OÂOËOÔOêOPP2PLPePPšP¶PÐPíPQ#Q*Q EQRQYQ3kQ3ŸQ4ÓQ.R%7R]R&qR%˜R¾R%ÕR3ûR,/S)\S†S"ŸS!ÂSäSûST.TDT"ZT*}T¨T&ÂT&éT&U&7U&^U…U U$¾UãUþUV,2V_V%}V,£V-ÐV þV&WFWeW„WžW²WÒW‰òW2|X¯X"ÊX4íX"Y#4Y XY=bY Y<±YîY'Z6Z)?Z(iZ ’Z³ZµZ½Z$ÎZóZ) +-[(4[][ m[y[#[/´[ä[ö[ \ \%\9\ N\Z\j\\ ›\¨\¾\ Õ\ á\ë\ï\ ]&]-<]!j]Œ]ª]È]ß]&ÿ]%&^0L^!}^Ÿ^-·^å^%_)(_'R_%z_& _Ç_ã_ ý_ +-`%`<`X`u`@Ž`DÏ`a'a@a Ua=_aaÇ·ab7žb2Öb- c7c$Jc +-oczc€c!„c¦c·cÐcícdd/dJd^drd3†d-ºd2ède,e5e;jzjƒj‡jšj!®j Ðj!Ýjÿj.kMk ak nk"{kžk±kÄk Úkäk+ük(lElVlmlŠl¤l¼lØlðl +-m1m$Mmrm„mŸm´mÏm çmômn +-n#n*n20ncnrn‹n šn¨nÄnÚnón oo!3oUosos“op*pCp]pnppžp±pÅpÝpópq qq9qVqnq„q,q +-ÊqÕq Üqéqr#r>rXrprr#¢rÆrÖrírs#&sJsjssss s²sÊsÝsæsöst1tPtptt™t¨tÂtÕtôtu*#uNuUumu‰u ™u!£u ÅuÏuéu v"v @vMvavrvƒv v(¾vçvww5wOwew~wŽw w´w½wÓwãw.ów"x 4x#Bx0fx%—x½xÑxçxøx y#y@yOymy„y›yºyØyÝyðyz+zEz_zqzƒzz·zÐzìz! {.{G{b{~{—{µ{"Î{ ñ{þ{ |$|8|J|`|-o|-|!Ë|í|}}2}C}2Z}#} ±}¾};Ò}~$~@~X~ r~ €~¡~¿~Ð~Ö~ð~/J&cŠŸ´½Ü ö€$0€ U€ c€o€…€š€²€º€Ë€߀ô€ *((S |‰"ƒÀD‚K‚$e‚ +-Š‚•‚«¤‚P„ `„n„!‚„¤„³„Ç„å„"ø„…*…@…S…'c…#‹…6¯… æ… +-ô…ÿ…"†"*†M†"g†Š†ª†ĆÛ† ñ†ÿ† ‡‡*‡C‡Z‡o‡‡–‡«‡½‡χ á‡î‡ ˆˆ#%ˆ:Iˆ„ˆšˆ%°ˆÖˆ"숉!‰ @‰"a‰ „‰¥‰¿‰ωá‰æ‰ë‰Š!ŠF>Š …Š.Š-¾Š6ìŠ8#‹;\‹I˜‹â‹ú‹Œ+$Œ+PŒ'|Œ¤Œ ÄŒ ьیùŒ&(.O&~¥,µâŽCŽ#aŽ…Ž¤Ž!ÀŽ"âŽ. 4%U;{&·Þ1þ0 KW"h‹'§Ïç.‘3‘"J‘(m‘-–‘Ä‘Ü‘!ù‘’8’X’t’!’²’Ê’æ’9ý’47“8l“+¥“8Ñ“$ +-”"/”!R”.t”£””á”<•;>•$z•Ÿ•·•*ו7–:–"Y–|–)–N¹–U—^—&|—)£— Í—Û—+ô— ˜>˜X˜j˜"Š˜%­˜*Ó˜*þ˜)™=™0W™ˆ™§™+Ç™7ó™#+šOš!mš$š!´šÖš&ñš%›,>›k›'z›%¢›0È›2ù› ,œ.9œhœKœLÍœLg+{2§2Ú/ ž$=žbž%xž-žž$Ìžñž Ÿ'Ÿ:Ÿ(QŸ&zŸ!¡ŸßFÚŸ! B4 Bw ?º <ú 77¡o¡Š¡#¥¡.É¡0ø¡0)¢Z¢x¢‹¢§¢¼¢Тå¢ÿ¢£%£;£O£#d£5ˆ£G¾£ ¤#¤58¤ n¤{¤-’¤!À¤(â¤- ¥9¥J¥'\¥?„¥=Ä¥ ¦.¦ ?¦9`¦;š¦,Ö¦*§#.§R§%l§A’§Ô§ñ§I¨7X¨3¨+Ĩð¨'©!/©Q©.b©‘©C¤©*è© ªª(8ªaª1tª¦ªÁª:ݪ«)6«*`«#‹«¯«$Ï«ô«¬",¬O¬m¬‡¬¤¬>Ĭ­!"­ D­(e­$Ž­³­*É­=ô­H2®{®Š®Eš®&à®(¯'0¯EX¯ž¯(·¯'à¯$°,-°)Z°%„°ª°"È°ë°& ±0±PO±V ±U÷±OM²V²!ô²'³*>³/i³*™³$ij/é³1´/K´){´*¥´)д#ú´µ-9µ&gµ4Žµ(õìµ ¶ ¶#(¶$L¶"q¶”¶ª¶ĶÛ¶.춷;·3X·Œ·#ž·· Û·å·0ü·-¸$I¸n¸‡¸#˜¸ ¼¸ȸݸñ¸¹)¹4B¹w¹Š¹§¹'ǹBï¹D2ºjwºKâº?.»n»»!ª»Ì»æ»¼¼"3¼V¼r¼ƒ¼¡¼#»¼#ß¼#½0'½#X½|½š½*¸½%ã½R ¾\¿s¿YŠ¿Tä¿79À9qÀ«À¾ÀÜÀðÀÁÁ1ÁKÁM_Á­ÂÃÂ"ÖÂ"ùÂÃ;8ÃtÃ|ÄÚñÃËÃâÃüÃÄ1ÄJÄfÄ~ÄšÄ%²ÄØÄßÄ úÄÅÅ8!Å8ZÅF“Å-ÚÅ*Æ3Æ&MÆ$tÆ™Æ.´Æ1ãÆ4Ç*JÇ uÇ,–Ç3ÃÇ ÷Ç"È;ÈUÈhÈ&€È:§ÈâÈ+üÈ+(É'TÉ'|É'¤ÉÌÉ4ãÉ'Ê@Ê_ÊwÊ*‘ʼÊ#ÖÊ*úÊ+%ËQË$nË!“Ë µËÖËóË!Ì!1ÌSÌ/ãÌÍ(3Í7\Í”Í(¬ÍÕÍSäÍ8ÎIIΓÎ'²Î ÚÎ6æÎ+Ï%IÏoÏqÏzÏ1ÏÂÏ7ÕÏ1 Ð ?ÐMÐ]Ð5}Ð4³ÐèÐøÐ ÑÑ-Ñ"KÑnрќÑ&¹ÑàÑðÑ!Ò 1Ò?ÒRÒVÒlÒ5{Ò4±Ò.æÒ*Ó*@ÓkÓ/‹Ó1»ÓBíÓ?0Ô0pÔ"¡ÔDÄÔ+ Õ25Õ:hÕ;£Õ/ßÕ<Ö!LÖnÖ‹Ö!œÖ¾ÖÕÖ ôÖ×G4×W|×Ô× å×Ø"ØF+Ø%rØØØ+\ÙBˆÙ8ËÙ8Ú=Ú7UÚ +-Ú˜ÚžÚ$¢ÚÇÚâÚÿÚÛ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êKtê$Àêåêúê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ý(:ý2cý–ý¦ý(½ý˜æýþ‡þ%¡þ ÇþÑþÊçþ²ÃÒ!ã "*M'^†–¬¾+Í,ù9&` +-p {"ˆ#«Ï%é$'4\|œ®ÁÓç$BXu‘¤· Ê×õ #96pŽ1¬Þ*ü'<74t*©-Ô#&7OTYp#ŒJ° û+84?m;­@éR* .} '¬ Ô 0ä 0 +-+F +-+r +-ž +- ± +-"¿ +- â +- 6 2U +ˆ ´ 2Æ $ù   7? 5w -­ Û &û )" 7L +„ 6° Kç 43.hB—#Úþ7),a5Ž%Ä*ê>"T.w5¦4Ü$/(T&}*¤#Ï0ó2$%W(}&¦KÍ8<R0AÀ##&3J5~*´*ß* +-G5F}(Äí# +/8['”+¼è7M:Vˆß-ÿ(-Vf2†$¹Þû"8*V3/µå!þ5 Vq(=¹÷*-'X2€%³5Ù*+:f)u)Ÿ.É:ø34BwRKâK.z$“6¸6ï1&.X%‡.­6Ü( < \ z ‹ -£ *Ñ &ü #!E9!!A™!AÛ!K"Ii"?³" ó"%#:#2Z#4#4Â#÷#$.$M$a$t$Š$¦$»$Ò$ç$ü$/%3K%E%Å%1×%@ &J&Y&<q&)®&+Ø&1'6'G'4Y'>Ž'<Í' +-(-( G(=h(?¦(3æ(-)$H)m)+‡)D³)!ø)*a:*Fœ*Bã*9&+`+0{+)¬+Ö+4ë+ ,K8,1„,¶,Ç,5å,-33-g-‡-L›-!è-, +-.,7.%d.%Š.&°.'×."ÿ.("/*K/v/#‘/&µ/AÜ/0(=0)f0.0¿0Ó07í0K%1@q1²1 Á1AÎ12,02-]2D‹2Ð2=é23'30[33Œ3À31Þ3)4*:4)e4)4*¹4Xä4X=5[–5Wò5AJ6#Œ6)°64Ú6773G7*{72¦7=Ù7:8/R8-‚8,°8)Ý89)%9,O9A|90¾9ï9 : :'1:'Y:&:¨:Ç:ã: ÷:9;>;!U;:w;²;%Ç;í; +- <<33<#g<*‹<¶<Ô<+ï<=+=B=W=l=‰=<¤=á=ú=!>&9>D`>B¥>jè>SS?H§?ð?"@(3@\@+z@¦@À@3Ø@% A2A EAfA(…A(®A(×A:B(;B)dB)ŽB6¸B7ïBÙkÝß@,Œ(Èø:CØ÷p}Õë2ÑëkD†!aSqäJw7ºý@„EVH¿sèlsŠu[¢vË©á: ã6=u‚ño.£ |dãpÔ9™$–[¥l?úC`ŒŒ‡*€X9IÊSVp!Ò…ydá‡þ£בQò1õÂn^ +- m4·¨?îm³rŠþ]„ý‚Ì#´/_JÄœsfQ8årÍz•ƒ<ÖxB{Kˆå>÷DM¢œùÓ>·ÇoiÃ@xµûb ¶ga„Eoe-xWØ؃ZsR"ˆ4/îÁ*Û(äÇ…1 kLVÌN)²‰Ay¹*íf$XQ)#K¤ûÕ[qDáè½TaÄ.ÜùT,'ûu\àê!3ë‹g +-=H]Ó-5Oz»ßj«¬Ú ƒõôïí¿®Á”.¯ø†G’jJZ„R™›C¯3ÿÆ%e`«Ô¡ÉUm{QcP˜«¾òÀƺ6rÍ`ÿ³tôe5‹Fh|›§ìbܱ²ÈeÙ\~2E j¼#š þmÅy ¶1Mö\»4fR ¨×7YŠfL˜FΠª ‰<È¥  Ú’³{iYÏãç÷ %ÿ§(cŽÒ~,Ÿ{é‚ ñC5"Ñ?Ðv)…? +-+/~_"}W|ÛÉdµ¡O"=™R¤Lݽ@uÄ7^ý®8P‡Ãªy` <w}_¨'HdÑnš®ïH”GŽ5>+SÕ-Ý­Yú!©¾Iõgl¼^zßÒvžÞ¹öͤNA|ôtWÏ·+ðƒ$3h̪cèŒb&A´ib[ ¦8Û“ÞOàÔo×Y#róN0——í;n°Ü%‚ñó¼Ëžð E K +-M꿬âh¬XTt ¾^ü9‹M J”âµ>+Š(ì2c±‘6&£œV)†ü›¡¦úU=B•“º;véÊì0Ë€ZüÊï%ɯâ½~]ಘð1¶Np2i':0-DÅ°¸S­ÚÖWL8Óꦟî}¹ç,ø°¸Ðtäö&‘Bw†ælÏIæó‹å6'“ÎçUÙ‰À:*øF‰»– n.…q7éx/Þw;ŸÇž’À&§´G;TZF©g4ˆqò_OKP\–Æ—X•IzÅÂÁ‡G0aAˆBæjUù­€€š<$Ðk¥¢ÎÖ]PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Brazilian Portuguese +-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: %sA linha "Zone %s" e a opção -l são mutuamente exclusivasA 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: deve ser maior que +-%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 caracter não deve estar na classe `%s' caracter não está na classe `%s'?AbortadoDireitos de Acesso : Acessando uma biblioteca compartilhado corrompidaEndereço já em usoFamília de endereços não suportada para nome de máquinaFamília de endereços não suportada pelo protocoloErro de avisoAlarme de tempoLista de argumentos muito longaTentativa de remoção de uma tabela que não está vaziaTentando o link em muitas bibliotecas compartilhadasAutenticação OKErro de autenticaçãoOBJETO FALSO +-Endereço inválidoDescritor de arquivo inválidoFormato do arquivo fonte inválido Mensagem inválidaChamada de sistema inválidaValor inválido para ai_flagsSe extremamente compatível com o POSIXDados binários +-Dispositivo de bloco requeridoProblema em select para broadcastPipe quebradoErro no barramentoCDSTempo de CPU excedidoTempo expiradoNão foi possível acessar uma biblioteca compartilhadaNão posso executar bind com o servidor deste domínioNão foi possível comunicar-se com o portmapperNão foi possível comunicar-se com o ypbindNão foi possível comunicar-se com o ypservNão foi possível alocar memóriaNão foi possível acessar o endereço requisitadoNão é possível criar socket para rpc de broadcastNão foi possível executar uma biblioteca compartilhado diretamenteNão é possível ter mais de um indicador de geração de arquivo! +-Não foi possível receber resposta para broadcastNão foi possível registrar serviçoNão é possível enviar após desligamento do ponto final de transporteNão foi possível enviar pacote de broadcastNão foi possível usar opção do socket SO_BROADCASTNao é 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 intervaloSeparador de caracteres "%c +-Filho finalizadoCredencial do cliente muito fracaColunas : +-Erro de communicação ao enviarCompila especificação localizadaO computador comprou a fazendaO 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 recusadaConexão fechada pela outra pontaTempo esgotado para conexãoContinuaConverte codificação dos arquivos dados de uma codificação para outra.Converte chave para letras minúsculasCopyright (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 produzidasCria um base de dados DB simples de uma entrada textual.Horário de criação : %sEntrada DES para nome de rede (netname) %s não é única +-DIRETÓRIO +-DNANSDNSBase de dados para tabela não existeBase de dados está ocupadaDireitos de Acesso padrão : +-Endereço de destino requeridoDispositivo não é um streamDispositivo não configuradoDispositivo ou recurso está ocupadoDiffie-Hellmann (%d bits) +-Diretório : %s +-Diretório não vazioCota de disco excedidaNão divide (fork) e mostre mensagens na tty correnteNão mostra mensagens enquanto constrói base de dadosNão usar catálogo existente, forçar novo arquivo de saídaDomínio não limitado (not bound)trap EMTENTRADA +-Dado criptografado +-Tipo de entrada/tabela incompatíveisErro no subsistema RPCErro acessando arquivo inicial do NIS+. O NIS+ está instalado?Falha no erro desconhecido do sistema: Erro durante a chamada a processo callbackErro: arquivo .netrc é legível por outros.Troca completaErro no formato execFATAL: sistema não define `_POSIX2_LOCALEDEF'ARQUIVO contém mapas de nomes simbólicos para valores UCS4Falha (erro não especificado)Descritor de arquivo em mal estadoArquivo existeErro de bloqueio em arquivo (deadlock)Nome de arquivo muito longoExcedido tamanho limite de arquivoArquivo muito grandePrimeira/próxima corrente quebradaExceção de ponto flutuanteResincronismo total necessário para o diretórioFunção não implementadaGRUPO +-Lixo em ARGP_HELP_FMT: %sGera 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 sistemaPegar informações específicas de localização.Retorna uma mensagem de uso curtaRetorna este arquivo de ajudaErro gratuitoGrupo : %s +-Indicadores de Grupo :Entrada de Grupo para grupo "%s.%s": +-Pendurar por SEG segundos (o padrão é 3600)DesconexãoNã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á desligadoFalha na procura do nome de hostpossível E/SARQUIVO-ENTRADA ARQUIVO-SAÏDA +--o ARQUIVO-SAÍDA ARQUIVO-ENTRADA +--u ARQUIVO-ENTRADAtrap IOTIVYIdentificador removidoInstrução ilegalTipo ilegal de objeto para a operaçãoProcura ilegalTipo ou formato de arquivo inapropriadoioctl inapropriado para dispositivoOperação inapropriada para processo em backgroundRequesição de informaçãoInformação:Arquivos de entrada:Especificação de formato de Entrada/Saída:Erro de entrada/saídaErro NIS internoErro interno de ypbindInterrupçãoChamada de sistema interrompidaChamada de sistema interrompida deve ser reiniciadaObjeto inválido para operaçãoArgumento inválidoReferência anterior inválidaNome de classe de caracter inválidoCredencial de cliente inválidoVerificador de cliente inválidoCaracter de comparação inválidoConteúdo inválido de \{\}Link entre dispositivos inválidoTroca inválidaMultibyte ou caracter largo inválidoExpressão regular precedente inválidaIntervalo final inválidaExpressão regular inválidaCódigo de requisição inválidoDescritor de requisição inválidoVerificador de servidor inválidoSlot inválidoÉ um diretórioÉ um arquivo tipo nomeávelKerberos. +-MortoLINK +-Entrada LOCAL para UID %d no diretório %s não é única +-Parada de sistema nível 2Nível 2 não sincronizadoNível 3 paradoNível 3 resetadoVínculo aponta para nome ilegalLink foi cortadoNúmero de link fora da faixaTipo de Objeto Vinculado (linked) : Vinculado (linked) para : %s +-Não foi configurado nome de domínio localFalha na alocação de recurso localA maquina não está na redeNome malformado ou ilegalParâ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óriaMemória esgotadaMensagem muito longaAtributo perdido ou malformadoHorário Mod. : %sModificação falhouOperação de modificação falhouFormato de modificação de saída:Tentativa de MultihopNOMENOME +-[-a|-m]NISVersões cliente/servidor NIS não conferem - não é possível oferecer serviçoBase de dados de mapas NIS está ruimOperação NIS+ falhouServidores NIS+ fora do alcanceServiço NIS+ está indisponível ou não está instaladoSEM OBJETO +-NÚMERONome : `%s' +-Servidor de Cache de Nomes.Nome não servidor por este servidorO nome não é único na redeNome ou serviço desconhecidoNome/entrada não é únicoObjeto nomeado não é pesquisávelÉ necessário um autenticadorA rede desconectou-se ao resetarA rede não respondeA rede está fora de alcanceNão há estrutura CSI disponívelNão há semáforos XENIX disponíveisNão há endereço associado com o nomeNão há endereço associado com o nomeSem anodeNão há espaço de buffer disponívelNão há processos filhosNão há dados disponíveisNão há espaço disponível no servidorNão há locks disponíveisNão confereMídia não encontradaNão há mensagens do tipo desejadoNão há mais registros no banco de dados mapNão há expressão regular anteriorNão há programas remotos registrados. +-Não há rota para o hostNão há espaço disponível no dispositivoDispositivo inexistenteArquivo ou diretório não encontradoChave no está no mapaMapa não encontrado no domínio do servidorProcesso inexistenteNamespace NIS+ não encontradoFalha irrecuperável na resolução de nomenenhum. +-Não encontrado, nome inexistenteNão é um arquivo nomeável XENIXNão é um diretórioNão encontradoNão é um servidor mestre para este domínioDono inválidoNúmero de Colunas : %d +-Número de objetos : %u +-Argumento numérico fora de domínioResultado numérico fora de alcanceObjeto #%d: +-Nome do Objeto: %s +-Tipo do Objeto: Objeto é remotoObjeto com o mesmo nome existeNúmero ímpar de aspasSomente o superusuário pode usar esta opção!Operação já em progressoOperação não permitidaOperação não suportada Operação agora em progressoOperation causaria bloqueioSem recursos de streamsControle de Saída:Seleção de Saída:Dono : %s +-PRIVADO +-Pacote não instaladoErro de verificação (parser): %sSucesso ParcialObjeto passado não é o mesmo objeto no servidorPermissão negadaFalha de energiaFim prematuro da expressão regularMostra o conteúdo da base de dados do arquivo, um entrada por linhaMostra estatística da configuração atualMostra mais mensagensMostra versão do programaSucesso provávelProvavelmente não encontradoTempo expirado para profilingDriver de protocolo não anexadoErro de protocoloFamília de protocolo não suportadaProtocolo não disponívelProtocolo não suportadoTipo errado de protocolo para socketPergunta ilegal para tabela nominadaSairErro específico de RFSProcedimento RPC ruim para programaFalha RPC na operação NISPrograma RPC não disponívelVersão incorreta de programa RPCEstrutura RPC inválidaVersão RPC incorretaRPC: (código de erro desconhecido)RPC: Erro de autenticaçãoRPC: Impossível decodificar resultadoRPC: impossível codificar argumentosRPC: Falhou (erro não especificado)RPC: Versões incompatíveis de RPCRPC: Falha no Port mapperRPC: Procedimento indisponívelRPC: Programa não registradoRPC: Programa indisponívelRPC: Programa/versão incompatíveisRPC: Erro remoto de sistemaRPC: O servidor não pode decodificar os argumentosRPC: SucessoRPC: Tempo esgotadoRPC: Impossível receberRPC: Impossível enviarRPC: Host desconhecidoRPC: Protocolo desconhecidoRSA (%d bits) +-RTLD_NEXT usado em código não dinamicamente carregadoLê e mostra perfil de dados do objeto compartilhadoLê configuração de dados de NOMESistema de arquivos somente para leituraSinal de tempo-real %dExpressão regular muito longaErro de E/S remotaEndereço remoto alteradoRemova senha ou torne arquivo não-legível por outros.Reabertura de objeto compartilhado `%s' falhouDuplicado : +-Reporte erros (bugs) para %s. +-Reportar erros usando o script `glibcbug' para . +-Argumentos de requisição inválidosErro de resolvedor 0 (não há erro)Erro interno do resolvedorEvitado deadlock de recursoRecurso perdidoRecurso temporariamente indisponívelResultados enviados para processo chamadorSHOBJ [PROFDATA]SUNYPRota de Busca :%s +-Falha de segmentaçãoServidor ocupado, tente novamenteMemória do servidor exauridaServidor rejeitou credencialServidor rejeitou verificador`Servname' não suportado para `ai_socktype'Configura o nome do programaEncerra o servidorSinal 0Operação socket em um arquivo não-socketTipo socket não suportadoTérmino de conexão causada por softwareLamento. Você não é o superusuário +-Definições fonte são encontrada no ARQUIVOErro de SrmountFalha de pilhaManipulador de arquivo NFS corrompidoIniciar NÚMERO de linhas (threads)Posição : %s +-ParadoParado (sinal)Parado (entrada tty)Parado (saída tty)Erro de pipe streamsA estrutura necessita de limpezaSucessoSuprime avisos e mensagens de informaçãoNomes de caracteres simbólicos definido en ARQUIVOErro de sistemaInformação do Sistema:Falha de alocação de recursos do sistemaDiretório do sistema para mapas de caracteres: %s +- mapas de repertório: %s +- rota de localização: %s +-%sTABELA +-Tipo de Tabela : %s +-Falha temporário na resolução de nomeTerminadoÁrea de texto ocupadaA 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 expiradoMuitos atributosMuitos níveis de links simbólicosMuitos linksMuitos arquivos abertosMuitos arquivos abertos no sistemaMuitos processosMuitas referências: não é possível unirMuitos usuáriosTrace/breakpoint trapContrabarra finalTradutor mortoPonto final de transporte já está conectadoPonto final de transporte não está conectadoTente `%s --help' ou `%s --usage' para mais informações. +-Tentando %s... +-Tipo : %s +-DESCONHECIDOImpossível autenticar cliente NIS+Impossível autenticar servidor NIS+Impossível criar chamadorImpossível criar processo no servidorDesconhecido (tipo = %d, bits = %d) +-Palavra-chave em .netrc desconhecida %sCódigo de erro NIS desconhecidoBase de dados desconhecida: %s +-Erro desconhecidoErro desconhecido Host desconhecidoObjeto desconhecidoOpção desconhecida: %s %s %sErro desconhecido do resolvedorErro desconhecido de servidorSinal desconhecido %dErro desconhecido de sistemaErro desconhecido de ypbind( ou \( descasados) ou \) descasados[ ou [^ descasados\{ descasadoVariável não reconhecida `%s'Condição urgente de E/SUso:Uso: %s nome_da_variável [caminho] +-Uso: rpcinfo [ -n númporta ] -u host númprog [ númvers ] +-Sinal 1 definido pelo usuárioSinal 2 definido pelo usuárioValor muito extenso para o tipo de dados definidoTemporizador virtual expiradoResultado insensato da execução do comandoJanela alteradaEscreve nomes dos mapas de caracteres (charmaps) disponíveisEscreve nomes das localizações (locales) disponíveisEscreve nomes das categorias selecionadasdEscreve nomes das palavras-chave selecionadasEscreve a saída para o arquivo NOMEEscrito por %s. +-Tipo de mídia incorretaX500XCHSYPBINDPROC_DOMAIN: %s +-Sim, 42 é o sentido da vidaVocê realmente o destruiu desta vezTempo 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 desconhecidoFamília de protocolo (ai_family) não suportadaTipo socket (ai_socktype) não suportadojá está rodandoargumento para <%s> deve ser um caracter simplesargumento para `%s' deve ser um caracter simplesauth_none.c - Problema fatal de marshallingauthunix_create: não há memória suficiente +-argumento inválidodono inválidocampo FROM em branco na linha Linkcampo TO em branco na linha Linkbloco 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 buffercache_set: não foi possível alocar novo rpc_buffercache_set: alocação de vítima falhoucache_set: vítima não localizadanão é possível determinar abreviação para zona de temponã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órianão é possível criar descritor internonão é possivel criar descritores internosimpossível habilitar soquete para aceitar conecções: %simpossí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 é %dnão é possível inserir elemento de comparação `%.*s'não é possível inserir na tabela de resultadosnão é possível inserir nova definição de símbolo de comparação: %simpossível carregar perfis de dadosimpossível abrirnão é possível abrir `%s'não é possível abrir arquivo de banco de dados `%s': %snã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ídanã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 ordemnão é possível ler diretório de mapa de caracter `%s'impossível ler arquivo de configuração; isto é fatalnão é possível ler do clientenã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ísticanão é possível ler atributos do arquivo `%s': %snão é possível escrever arquivo de saída para `%s'não é possível escrever resultado: %snão é possível escrever estatisticas: %snão é possível escrever para o clientecategoria de dados requisitada mais que uma vez: isto não deveria acontecercaracter %s'%s' na classe `%s' deve estar na classe `%s'caracter %s'%s' na classe `%s' não deve estar na classe `%s'caracter não definido no mapa de caracterescaracter `%s' não definido enquanto necessário como valor defaultclasse de caracter `%s' já definidamapa de caracteres `%s' já definidoarquivo de mapa de caracter `%s' não foi localizadoclnt_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 linhao símbolo de comparação `%.*s' aparece mais que uma vez: ignorar linhasímbolo de comparação esperado após `%s'connectar-se ao endereço %s: identificador ou constante esperadoconversão de `%s' para `%s' não é suportadaa conversão parou devido a problemas de escrita na saídanã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 localizadoflag 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 simplesnome de caracter duplicado `%s'definição de elemento de comparação duplicadadefinição para caracter duplicada `%.*s'chave duplicadadefinição de conjunto duplicadanome de zona duplicado %s (arquivo "%s", linha %d)identificador de mensagens duplicadonúmero de mensagem duplicadocadeia de caractere vazianome do peso vazio: linha ignoradaenablecache: cache já ativadoenablecache: não foi possível alocar cacheenablecache: não foi possível alocar dados do cacheenablecache: não foi possível alocar cache fifocodificação para a saídacodificação para o texto originalo ponto final da área da elipse é maior que o início erro fechando entrada `%s'erro fechando arquivo de saídaerro fechando arquivo de dados de perfilerro enquanto inserindo elemento de comparação na tabela hasherro ao inserir na tabela hashenquanto lendo entradaesperado argumento tipo string para `copy'linha de continuação não foi localizadafalha no carregamento do objeto compartilhado `%s'falha para carregar dados de símbolosfalha para mapear (mmap) o arquivo de dados do perfilfalha para iniciar o processo de conversãofalha ao escrever dados para categoria `%s'fcntl: F_SETFDcampo `%s' na categoria `%s' não definidocampo `%s' na categoria `%s' não definidoarquivo `%s' já existe e pode ser sobrescrito +-valor `from' do elemento de comparação deve ser uma stringfalha em fstatlixo no final da especificação do código de caracterlixo no final do númerolixo 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 chamadasgera 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 usadovinculo (hard linked) em algúm lugarCampo CORRECTION ilegal em linha Leap (ajuste)campo Rolling/Stationary ilegal em linha Leap (ajuste)constante de caracteres ilegal na stringcaracteres ilegais no arquivo: elemento de comparação ilegaldefinição ilegaldada codificação ilegalsequência de escape ilegal no final da stringsequência de entrada ilegal na posição %ldnomes ilegais para faixa de caracteresnettype ilegal: `%s' +-número ilegal para offset na string %d no campo `era', categoria `%s'número de conjunto ilegaldata 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 caracterlimite de implementacão: não são permitidos mais que %d mapas de caractercaractere incompleto ou mudança de seqüencia no final do bufferarquivo formatado incorretamentelinha de entrada de tipo desconhecidoerro interno (descritor ilegal)erro interno - addtype chamado com isdst incorretoerro interno - addtype chamado com ttisgmt incorretoerro interno - addtype chamado com ttisstd incorretoerro interno em %s, linha %udeslocamento UTC inválidoformato de abreviação inválidodia do mês inválidoano final inválidoano bissexto inválidomodo inválido para dlopen()nome do mês inválidotempo gravado inválidoano inicial inválidohora do dia inválidanome de dia de semana inválidotamanho de chave na requisição muito longa: %Zdlinha após elipse deve conter definição de caracterlinha antes da elipse não contém definição para constante de caracterlinha muito longalista todas as coleções de caracteres codificadosarquivo locale `%s', usado na declaração `copy' , não encontradofalha em lstatlinha inválida ignoradamapeamento da tabela de cadeias do cabeçalho da seção falhoumapeamento dos cabeçalhos da seção falhoumemória sobrescrita antes do bloco alocado +-memória sobrescrita após o fim do bloco allocado +-memória esgotadamemó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 nomecodificação original nem destino especificadanetname2user: (nis+ lookup): %s +-netname2user: entrada DES para %s no diretório %s não é únicanetname2user: entrada LOCAL para %s no diretório %s não é únicanetname2user: lista de id do grupo perdida em `%s'.netname2user: nome principal `%s' muito longonetname2user: não deve possuir uid 0nunca registrado prog %d +-Valores ou não entradosnão há expressão regular correta para campo `%s', categoria `%s': %snehum dia do mês satisfaz a normanã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' é usadonenhum arquivo de saída foi produzido porque avisos foram emitidosmapa de repertório não especificado: não posso prosseguirnenhum nome simbólico dadonenhum nome simbólico dado para fim do intervalonão foi definido peso para o símbolo `%s'não é arquivo normalconfiguraçã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 CHARMAPcodificação original não especificada usando `-f'arquivo de saídaproblemas de pmap_getmaps rpcpoll: falha de protocolo na configuração do circuito +-Erro de pré-processadormostra lista de número de rotas e seu número de usomostra informações de progressoproblems 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 momentoarquivo de mapas `%s' não foi localizadorpcgen: 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 portmappermesmo nome de regra em múltiplos arquivosfalha na leitura lendo chave de requisição: %sproblems lendo `%s'Erro escrevendo em %s: %ssocket: falha de protocolo na configuração do circuito +-as ordens de classificação `forward' e `backward' são mutuamente exclusivasespecificação de peso para símbolo de comparação não faz sentidoentrada padrãosaída padrãodata inicial é ilegal na string %d no campo `era', categoria `%s'ano inicial maior que ano finalano inicial muito alto para ser representadoano inicial muito baixo para ser representadodata de término é ilegal na string %d no campo `era', categoria `%s'svc_run: - select falhousvc_tcp_.c - não é possível receber `getsocknome' ou `listen'svc_tcp_.c - problema na criação do soquete AF_UNIXsvc_tcp: makefd_xprt: não há memória suficiente +-svc_tcp_.c - problema na criação do soquete AF_UNIXsvc_tcp_.c - memória exauridasvc_unix: makefd_xprt: não há memória suficiente +-svctcp_create: não há memória suficiente +-svcudp_create - não é possível getsocknamesvcucp_create: não há memória suficiente +-svcudp_create: problema na criação socketsvcunix_create: não há memória suficiente +-símbolo para elemento de comparação multicaracter `%.*s' duplica a definição do elementosímbolo para elemento de comparação multicaracter `%.*s' duplica a definição do elementosímbolo para elemento de comparação multicaracter `%.*s' duplica outra definição de símbolosímbolo para elemento de comparação multicaracter `%.*s' duplica a definição do símbolosímbolo para elemento de comparação multicaracter `%.*s duplicadoerro de sintaxe na definição %s: %serro de sintaxe na diretiva `order_start'erro de sintaxe na definição de classe de caractereserro de sintaxe na definição de conversão de caractereserro de sintaxe na definição de ordem de comparaçãoerro de sintaxe na definição de comparaçãoerro de sintaxe na definição da categoria LC_CTYPEerro de sintaxe na definição de uma nova classe de caractereserro de sintaxe na definição de um novo mapa de caractereserro de sintaxe na definição da mensagem localeerro de sintaxe na definição monetária localeerro de sintaxe na definição numérica localeerro de sintaxe na especificação de ordemerro de sintaxe em prolog: %serro de sintaxe no mapa de repertório: %serro de sintaxe na definição de tempo localeerro de sintaxe: não está dentro de uma definição de seção localecodificação destino não especificada usando `-t'esta é a primeira definiçãotempo menor que zeroestouro de tempopoucos bytes na codificação do caractermuitos bytes na codificação do caractermuitas classes de caracteres definidasexcessivos ajustes em segundosmuitos tipos de tempo localmuitas transições?!muitos pesosabreviações de zona de tempo excessivas ou muito extensaslixo no final da linhaproblemas respondendo ao prog %d +-duas linhas em uma lista contendo `...' não são permitidasdigitado ano simplesincapaz de alocar espaço para entradanão consegui liberar parâmetrosindefinidocaracter desconhecido `%s'caracter desconhecido no campo `%s', categoria `%s'diretiva de comparação desconhecidadiretiva desconhecida `%s': linha ignoradaerro iconv() desconhecido: %dconjunto desconhecido `%s'símbolo desconhecido `%.*s': linha ignoradazona sem regrasmensagem não terminadastring não terminadastring não terminadanome simbólico não terminadonome do peso não terminadoo limite inferior do intervalo é maior que o limite superioruso: %s arquivo_entrada +-use 2/29 em ano não bissextovalor para %s deve ser um inteirovalor para <%s> deve estar entre 1 e 4valor para campo `%s', categoria `%s', não deve ser uma string vaziao valor de deve ser maior que o valor de o valor do campo `int_curr_symbol' na categoria `LC_MONETARY' não corresponde a um nome válido na ISO 4217o valor do campo `int_curr_symbol' na categoria `LC_MONETARY' possui tamanho erradoos valores para o campo `%s' na categoria `%s' devem ser menores que 127enquanto aceitando conecção: %senquanto alocando entrada de cacheenquanto alocando entrada na tabela hashenquanto alocando chave cópiaenquanto abrindo antigo arquivo de catálogoenquanto preparando saídaenquanto lendo databaseenquanto escrevendo arquivo data de dados de perfilenquanto escrevendo arquivo data baseescrita incompletapermissão de escrita para outrosnúmero incorreto de argumentosnúmero incorreto de campos na linha Leapnúmero incorreto de campos na linha Linknúmero incorreto de campos na linha Rulenúmero incorreto de campos na linha de continuação de Zonenúmero incorreto de campos na linha Zonexdr_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ÔKMçKE5L&{L(¢LËLÜLôLMM)MDM^MnrMáNóN"O"(OKO:gO¢O«O´OÊOáOûOP,PEPaPzP–P°PÍPåPQ +-Q %Q2Q9Q3KQ3Q4³Q.èQ%R=R&QR%xRžR%µR3ÛR,S)UeU }U$žUÃUÞUøU,V?V%]V,ƒV-°V ÞV&ÿV&WEWdW~W’W²W‰ÒW2\XX"ªX4ÍXY#Y 8Y=BY€Y<‘YÎY'îYZ)Z(IZ rZ“Z•ZZ$®ZÓZ)êZ([=[ M[Y[#p[/”[Ä[Ö[ ë[ ù[\\ .\:\J\a\ {\ˆ\ž\ µ\ Á\Ë\Ï\ ç\&õ\-]!J]l]Š]¨]¿]&ß]%^0,^!]^^-—^Å^%â^)_'2_%Z_&€_§_Ã_ Ý_ê_``8`U`@n`D¯`ô`a a 5a=?a}aÇ—a_b7~b2¶b-ébc$*c +-OcZc`c!dc†c—c°cÍcác÷cd*d>dRd3fd-šd2Èdûd eee,eFe<]eše$ºe)ße ff1)f8[f”f¯f ÌfØfôfg g/gGg"`gƒgœg£gŽÀgOh dh…h h´hÅh Ùhçh$i,i"3i%Vi"|i"Ÿi%Âi èiõi j>jZjcjgjzj!Žj °j!½jßj.þj-k Ak Nk"[k~k‘k¤k ºkÄk+Ükl%l6lMljl„lœl¸lÐlêl1ûl$-mRmdmm”m¯m ÇmÔmãm +-ømn +-n2nCnRnkn znˆn¤nºnÓnénùn!o5oSossoço*øo#p=pNp_p~p‘p¥p½pÓpæp ëpøp9üp6qNqdq,}q +-ªqµq ¼qÉqäqrr8rPror#‚r¦r¶rÍrèr#s*sJsSsms€s’sªs½sÆsÖsñst0tPtatytˆt¢tµtÔtät*u.u5uMuiu yu!ƒu ¥u¯uÉu áuv v-vAvRvcv€v(žvÇvåvývw/wEw^wnw€w”ww³wÃw.Ówx x#"x0Fx%wxx±xÇxØxëxy y/yMydy{yšy¸y½yÐyîy z%z?zQzcz}z—z°zÌz!ìz{'{B{^{w{•{"®{ Ñ{Þ{í{||*|@|-O|-}|!«|Í|ã|÷|}#}2:}#m} ‘}ž};²}î}~ ~8~ R~ `~~Ÿ~°~¶~Ð~ã~ú~*&Cj”¼ Ö÷$€ 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‹;<‹Ix‹‹Ú‹ô‹+Œ+0Œ'\Œ„Œ ¤Œ ±Œ»ŒÙŒõŒ&./&^…,•ÂáCý#AŽeŽ„Ž! Ž"ÂŽ.åŽ %5;[&—¾1Þ +"7Z'vž¶.Ó‘"‘(<‘-e‘“‘«‘!È‘ê‘’'’C’!_’’™’µ’9Ì’4“8;“+t“8 “$Ù“"þ“!!”.C”r”‘”<±”;î”$*•O•g•*‡•7²•ê•" –,–)?–Ni–U¸–—&,—)S— }—‹—+¤—Зî—˜˜":˜%]˜*ƒ˜*®˜Ù˜í˜0™8™W™+w™7£™#Û™ÿ™!š$?š!dš†š&¡š%Èš,îš›'*›%R›0x›2©› Ü›.雜K1œL}œLÊœ++2W2Š/½$íž%(ž-Nž$|ž¡ž½žמêž(Ÿ&*Ÿ!QŸsŸFŠŸÑŸBäŸB' ?j <ª 7ç ¡:¡#U¡.y¡0¨¡0Ù¡ +-¢(¢;¢W¢l¢€¢•¢¯¢¢Õ¢ë¢ÿ¢#£58£Gn£ ¶£#Ä£5è£ ¤+¤-B¤!p¤(’¤-»¤é¤ú¤' ¥?4¥=t¥ ²¥.À¥ ï¥9¦;J¦,†¦*³¦#Þ¦§%§AB§„§¡§I¾§7¨3@¨+t¨ ¨'·¨!ߨ©.©A©CT©*˜© éÏ©(詪1$ªVªqª:ªȪ)æª*«#;«_«$«¤«À«"Ü«ÿ«¬7¬T¬>t¬³¬!Ò¬ ô¬(­$>­c­*y­=¤­Hâ­+®:®EJ®&®(·®'à®E¯N¯(g¯'¯$¸¯,ݯ) +-°%4°Z°"x°›°&¹°à°Pÿ°VP±U§±Oý±VM²!¤²'Ʋ*î²/³*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¿Ko¿,»¿.è¿À+ÀCÀXÀjÀÀ›À¸ÀˆÍÀVÂkÂ.€Â.¯ÂÞÂMý KÃUÃ^ÃuÃëÃÅÃáÃ!Ä#Ä!CÄeÄ!…ħÄÁÄ ßÄéÄ ÅÅÅ00Å0aÅ>’Å.ÑÅ%Æ&Æ*>Æ&iÆÆ*§Æ2ÒÆ.Ç(4Ç!]Ç)Ç4©Ç ÞÇ"ÿÇ "ÈCÈ\È*uÈ8 ÈÙÈ!ôÈ!É!8É!ZÉ!|ÉžÉ!¶É%ØÉþÉÊ9Ê,QÊ"~Ê!¡Ê,ÃÊ-ðÊ%Ë"DËgË,‚˯ËËËåËÌ#Ì3´ÌèÌ!Í/%ÍUÍ-gÍ •ÍUŸÍõÍIÎRÎ*pÎ +-›Î-¦Î"ÔÎ÷ÎÏÏ Ï'4Ï\Ï*pÏ+›ÏÇÏÜÏâÏ&Ð+'ÐSÐiÐÐ ’РР¹Ð ÚÐèÐÿÐÑ,Ñ;Ñ0YъљѫÑ$¯ÑÔÑ3íÑ;!Ò']Ò!…Ò!§ÒÉÒ*åÒ/Ó-@Ó:nÓ(©Ó!ÒÓ=ôÓ#2Ô3VÔ1ŠÔ4¼Ô-ñÔ?Õ$_Õ„Õ¡Õ#·ÕÛÕõÕ,ÖBÖAVÖ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ß4Yß Žß¯ß ÂßÏßæß$ùß$à 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ð‰ðŸð¸ðÊðÙð ððúðñ'ñ58ñnññ#“ñ9·ñ)ññò.òFò[òsòò­ò$½òâòÿò$ó#@ódókó €ó¡ó½óÝóøóô"ô>ô$Zô%ô$¥ôÊôéô"õ #õ Dõ#eõ‰õ&¨õ ÏõÛõðõ ö&ö;öQö=aö8Ÿö$Øö$ýö"÷:÷W÷k÷7‡÷.¿÷î÷þ÷Cø^ø xø™ø&²øÙøìø+ ù5ùOùUùrù"„ù§ù¿ùÚù+óùú7úGú2Púƒú#¢ú!Æú)èú û û0ûMûcû ~ûˆû›û¹ûØûêûü$ ü.1ü `ünü&„üƒ«ü/ý8ýUýuý~ýKýéþüþ ÿ#ÿBÿRÿ$mÿ’ÿ'£ÿËÿàÿþÿ%0&V<} º +-ÈÓ*Û*$1'V~"žÁÙ îü *BZp‚˜­¾Ï àì $#PH ™ º'Û!?&O,v!£&Åì (-2I!b[„ +-à#ë/;?:{:¶Dñ6Sr%z% (Æ#ï#3Qo*†2±/ä 73 k … JŸ /ê ? +-0Z +-(‹ +-)´ +-2Þ +-$ .6 Fe ,¬ )Ù - '1 Y .n ' >Å # (( ;Q  +® /Ú 6 +-A%_5…5»)ñ&+B,n!›%½ã>0?2p+£@Ï#"4&W5~"´#×Aû@=%~¤'¼+ä5!F0h™1­IßH)r'!µ×ç/1Qi%.§3Ö> +-@IŠœ0¶"ç( +-238f%ŸÅ*Ú**0&[2‚#µ(Ù*%<,b3Ã(ÖÿIK`H¬õ- 674n-£&Ñø)1>p‹§ÅÛ(ø,!"NqF‡ÎCå@):j8¥JÞ)E%c1‰3»3ï# B a | ” ¬ Ç ä þ !1!G!']!5…!C»!ÿ!"G." v"ƒ"2Ÿ""Ò"'õ",#J#\#*o#9š#7Ô# $2$ Q$;r$=®$0ì$/% M%$n%*“%E¾%-&$2&SW&;«&5ç&6'$T'7y' ±'Ò'1é' (8)(,b((ž(,·(ä(/÷(')F)<b)Ÿ)'¼)-ä)#*&6*$]*‚*$¢*(Ç*+ð*+5+U+?t+´+.Ó++,".,Q,p,,‡,=´,=ò,0-A-ES- ™-&º-%á-B.J.9c.-.(Ë.2ô.5'/)]/!‡/+©/!Õ/,÷/"$0LG0E”0QÚ0K,1Yx1 Ò1'ó1'2*C2+n2#š2,¾2-ë2-34G3?|38¼3$õ34-646d4B›4*Þ4 5 535C5c5!ƒ5¥5Á5Þ5 ò52þ516"H64k6 62±6ä6 77'"7J7*f7‘7ª7)¼7æ7ù7 88=8X8&m8”8(±8"Ú8$ý8;"9=^9[œ9Fø99?:y:•:%´:Ú: ÷:;/;,F;s; ‰;"—;º;Ò;ò;<,2<_<!<!¡<@Ã<.=ÙkÝß>,Œ(Èø:CØõp{Óë2ÏéiD„aQqâJv5ºý@EVF¿rèlsŠuZ¢vË©á: ã6;t‚ïo.£zbápÔ9™"”[£l?øA^Š}Š‡*~X9IÊSTn!Òƒwdß…þ£בOò1óÂn] +- m2µ¨?îm³rˆþ]„ý€Ê!´/^JÂœqdQ8åpÍ‚•ƒ<ÖxByIˆå<÷DM¢œ÷Ñ>·ÇohÁ@vµùb¶g`„Ene-wUÖØZsR ˆ4-î¿*Û(äÇ…1žjJVÌL)°‡Ax¹*íf$XQ'#K¤ûÕ[qBáæ»T_Ä,ÜùT,'ûsZàê!1ë‰f=H\Ó-5Mx¹Ýi«ªÚ õôíí½®Á”.¯ö†G’jJZ‚R—™›C­3ÿÆ%e_©Ò¡ÉUlyQcP˜«¾òÀĸ6rË`ý³sôd5‹Ff|›§ê`Ú±²ÆcÙ\~2E j¼#˜ ükÅy ¶1Mö[»4e P +-¦×7WˆfL˜FΠ¨ ‰<È¥  ر{gþYÏãç÷ %ÿ¥(bŒÐ|*Ÿ{ç€ ñC3"Ñ?Ðv)…= +-+/|_"}W|ÙÉd³ŸO"=™R¤LÛ½@uÄ7^û®8N…êy` :w}_¨%HcÑmš¬ïH’EŽ5>+SÕ+Ý­Yú!§¾Iõejº\zßÒuœÜ¹ôÍ¢N?zòtWÏ·)ðƒ$3h̪cèŒb&A²i‹aY¤6Û“ÞOàÔmÕY#qóN0——ë9l°Ü%‚ñó¼Ëžð C K +-Mè}¿¬âg¬VTt ¼^ú9‰K H”àµ>+ŠŽ&ì2a±‘4$¡šV)†ü›¡¦úU=B“‘º;téÈì.É€ üÊï#ǯâ½~ ]Þ²–î/´No0i'80-Dð¶S­ÚÔWL8Óê¦ì{·å,ø®¸Îräö&Bu„ækÍGæñ‹ã6'“ÌçS׉¾:(øD‡»– n.ƒp7éx/Þw;ŸÅž’‹À&§´G;RXFÀ©g4†oð]OKP\–Æ•X•IzÅÂÁÿ‡G0aA†@ähUù«~€š<$Ðk¥ ÎÖ[PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_raw.c - Fatal header serialization error.clnttcp_create: out of memory +-clntunix_create: out of memory +-collation element `%.*s' appears more than once: ignore linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Slovak +-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: %sRiadok "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: musí by» väè¹ie ako +-%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 znak nesmie by» v triede `%s' znak nie je v triede `%s'?Zru¹enéPrístupové práva : Prístup k po¹kodenej zdieµanej kni¾niciAdresa je pou¾ívanáTrieda adries nie je podporovaná poèítaèomTrieda adries nie je podporovaná protokolomChyba pri zverejneníBudíkPríli¹ dlhý zoznam argumentovPokus o odstránenie neprázdnej tabuµkyPokus o pou¾itie priveµa zdieµaných kni¾nícOverenie práv úspe¹néOverenie práv neúspe¹néPOCHYBNÝ OBJEKT +-Chybná adresaChybný deskriptor súboruChybný formát súboru rezov písmaChybná správaChybné volanie systémuChybná hodnota ai_flagsPresný súlad s POSIXBinárne údaje +-Vy¾adované blokové zariadenieProblém pri volaní poll pre v¹eobecné vysielaniePreru¹ená rúraChyba na zberniciCDSPrekroèený èasový limit pre procesor®ivotnos» cache vypr¹alaPrí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 rpcNie je mo¾né priamo spusti» zdieµanú kni¾nicuNie je mo¾né pou¾i» viac ako jeden príznak tvorby súboru! +-Nie je mo¾né prija» odpoveï na broadcastNie je mo¾né zaregistrova» slu¾buNie je mo¾né vysiela» po ukonèení èinnosti komunikaèného boduNie je mo¾né vysla» broadcast balíkNie je mo¾né nastavi» pre socket voµbu SO_BROADCASTNie 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 rozsahuOddeµovaè znakov : %c +-Detský proces skonèilOprávnenia klienta sú nepostaèujúceStåpce : +-Chyba komunikácie pri vysielaníKompilácia ¹pecifikácie národného prostrediaPoèítaè kúpil farmuVý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¹alPokraèovanieKonverzia 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 symbolovVytvori» výstupný súbor aj pri výskyte varovaníVytvorenie jednoduchej DB databázy z textového vstupu.Èas vytvorenia : %sDES záznam pre sie»ový názov %s nie je jednoznaèný +-ADRESÁR +-DNANSDNSDatabáza pre tabuµku neexistujeDatabáza je pou¾ívanáImplicitné príst. práva : +-Je potrebné zada» cieµovú hodnotuZariadenie nie je prúdZariadenie nie je nakonfigurovanéZariadenie alebo iný zdroj je pou¾ívanéDiffie-Hellmann (%d bitov) +-Adresár : %s +-Adresár nie je prázdnyDisková kvóta prekroèenáNespú¹»a» samostatný proces a zobrazova» správy na aktuálnom termináliPoèas tvorby databázy nevypisova» správyNepou¾íva» existujúci katalóg, vnúti» nový výstupný súborDoména nie je pripojenáEMT preru¹enieZÁZNAM +-©ifrované údaje +-Nesúlad záznamu s tabuµkouChyba v RPC subsystémeChyba 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 volaniaChyba: súbor .netrc je èitateµný pre ostatných.Stredisko plnéChybný formát spustiteµného súboruFATÁLNA CHYBA: systém nedefinuje `_POSIX2_LOCALEDEF'SÚBOR obsahuje mapovanie symbolických názvov na UCS4 hodnotyZlyhalo (ne¹pecifikovaná chyba)Deskriptor súboru v chybnom staveSúbor existujeVzájomné zablokovanie pri zamykaní súboruMeno súboru príli¹ dlhéPrekroèený limit då¾ky súboruSúbor je príli¹ veµkýChyba zre»azenia prvý/ïal¹íVýnimka pohyblivej rádovej èiarkyAdresár vy¾aduje úplnú resynchronizáciuFunkcia nie je implementovanáSKUPINA +-Nezmysly v ARGP_HELP_FMT: %sTvorba 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émuZíska» informáciu ¹pecifickú pre národné prostredie.Vypísa» krátky návod na pou¾itieVypísa» túto pomocVïaèná chybaSkupina : %s +-Príznaky skupiny :Záznam skupiny pre skupinu "%s.%s": +-Poèka» SECS sekúnd (implicitne 3600)ZavesenieNená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èaV/V mo¾nýVSTUPNÝ_SÚBOR VÝSTUPNÝ_SÚBOR +--o VÝSTUPNÝ_SÚBOR VSTUPNÝ_SÚBOR +--u VSTUPNÝ_SÚBORIOT preru¹enieIVYIdentifikátor odstránenýNeprípustná in¹trukciaNeprípustný typ objektu pre operáciuNeprípustné nastavenie pozícieNevhodný typ alebo formát súboruNevhodný ioctl pre toto zariadenieNevhodná operácia pre proces v pozadí®iados» o informáciuInformácia:Vstupné súbory:©pecifikácia vstupno/výstupného formátu:Chyba vstupu/výstupuInterná chyba NISInterná chyba ypbindPreru¹eniePreru¹ené volanie systémuPreru¹ené volanie systému by malo by» znovu spustenéNeplatný objekt pre operáciuNeprípustný argumentNeprípustný spätný odkazNeprípustný názov triedy znakovNeplatné oprávnenie klientaNeplatné overenie klientaNeprípustný znak triedeniaNeprípustný obsah \{\}Neprípustný odkaz medzi zariadeniamiNeprípustná výmenaNeprípustný alebo nekompletný viacbajtový alebo ¹iroký znakNeprípustný predchádzajúci regulérny výrazNeprípustný koniec rozsahuNeprípustný regulérny výrazNeprípustný kód ¾iadostiNeprípustný deskriptor ¾iadostiNeplatné overenie serveraNeplatná priehradkaJe adresárJe pomenovaný súborKerberos. +-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 hodnotyOdkaz odkazuje na neprípustný názovOdkaz bol znièenýÈíslo odkazu mimo rozsahuTyp odkazovaného objektu : Odkazuje na : %s +-Meno miestnej domény nie je nastavenéChyba pri pridelení miestnych zdrojovPoèítaè nie je zapojený v sietiChybne formované alebo neprípustný názovPovinné 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 zlyhaloPamä» vyèerpanáPríli¹ dlhá správaChýbajúci alebo chybne formovaný atribútÈas zmeny :%sModifikácia zlyhalaOperácia zmeny zlyhalaModifikova» výstupný formát:Pokus o spojenie cez viac uzlovNÁZOVNÁZOV +-[-a|-m]NISRozdielne verzie NIS klienta a serveru - nie je mo¾né poskytnú» slu¾buDatabáza máp NIS je chybnáNIS+ operácia zlyhalaNIS+ server nie je dostupnýSlu¾ba NIS+ nie je dostupná alebo nain¹talovaná®IADNY OBJEKT +-POÈETNázov : '%s' +-Démon cache slu¾by názvov.Názov nie je obsluhovaný týmto serveromMeno nie je v sieti jednoznaènéNázov alebo slu¾ba neznámeNázov/záznam nie sú jednoznaènéZadaný objekt nie je prehµadávateµnýPotrebuje overovací objektSie» 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ú adresuNázov nemá priradenú adresu®iadny anodeNie je mo¾né prideli» pamä» pre V/V operácieDetské procesy neexistujúDáta nie sú k dispozíciiNa serveri u¾ nie je ¾iadne miesto pre súboryZámky nie sú k dispozícii®iadna zhodaNená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ýrazNie sú registrované ¾iadne vzdialené programy +-Cesta k poèítaèu neexistujeNa zariadení u¾ nie je ¾iadne miestoTaké zariadenie neexistujeAdresár alebo súbor neexistujeTento kµúè v databáze neexistujeTáto mapa sa v doméne servera nenachádzaTento proces neexistujeZaznamenaný priestor názvov mimo NIS+Neopraviteµná chyba pri rie¹ení názvu®iadne. +-Nenájdené, takýto názov neexistujeNejde o pomenovaný XENIX súborNie je adresárNenájdenéNie je hlavný server pre túto doménuNie je vlastníkomPoèet ståpcov : %d +-Poèet objektov : %u +-Èíselný rozsah mimo domény definície funkcieÈíselný výsledok mimo povoleného rozsahuObjekt #%d: +-Názov objektu : %s +-Typ objektu : Objekt je vzdialenýExistuje objekt s rovnakým názvomNepárny poèet úvodzoviekTá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 prebiehaOperácia by blokovalaPrú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ý úspechOdovzdaný objekt nie je na serveri tým istým objektomPrístup odmietnutýVýpadok napájaniaPredèasný koniec regulérneho výrazuVypísa» obsah databázového súboru, jeden záznam na riadokVypísa» ¹tatistiku aktuálnej konfigurácieVypísa» viac správVypísa» verziu programuPravdepodobný úspechPravdepodobne nenájdenéProfilovací èasovaè vypr¹alOvládaè protokolu nepripojenýChyba protokoluRodina protokolov nie je podporovanáProtokol nie je k dispozíciiProtokol nie je podporovanýProtokol nie je socketom podporovanýNeprípustná otázka pre danú tabuµkuKoniecRFS-¹pecifická chybaChybná RPC procedúra pre programZlyhal RPC pri NIS operáciiRPC program nie je k dispozíciiChybná verzia RPC programuRPC ¹truktúra je chybnáChybná verzia RPCRPC: (neznámny chybový kód)RPC: Chyba pri overení právRPC: Nie je mo¾né dekódova» výsledokRPC: Nie je mo¾né zakódova» argumentyRPC: Zlyhalo (ne¹pecifikovaná chyba)RPC: Nekompatibilné verzie RPCRPC: Chyba portmapperaRPC: Procedúra nie je k dispozíciiRPC: Program nie je registrovanýRPC: Program nie je k dispozíciiRPC: Nesúhlasí program alebo verziaRPC: Chyba vzdialeného systémuRPC: Server nemô¾e dekódova» argumentyRPC: ÚspechRPC: Èasovaè vypr¹alRPC: Nie je mo¾né prijíma»RPC: Nie je mo¾né vysiela»RPC: Neznámy poèítaèRPC: Neznámy protokolRSA (%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 objektuNaèíta» údaje o konfigurácii z NÁZOVSúborový systém dovoµuje len èítanieSignál reálneho èasu %dRegulérny výraz príli¹ veµkýVzdialená V/V chybaVzdialená adresa sa zmenilaOdstráòte heslo alebo zaká¾te èítanie súboru ostatnými.Znovuotvorenie zdieµaného objektu `%s' zlyhaloReplika : +-Chyby hláste na adrese %s. +-Chyby hláste na adrese - pou¾ite skript `glibcbug'. +-Chybné argumenty ¾iadostiChyba resolvera 0 (¾iadna chyba)Vnútorná chyba resolveraBolo zabránené vzájomnému zablokovaniuZdroj bol stratenýZdroj je doèasne neprístupnýVýsledky poslané procedúre spätného volaniaZDIE¥_OBJEKT [PROF_ÚDAJE]SUNYPPrehµadávaná cesta : %s +-Chyba segmentácieServer zaneprázdnený, skúste znovuVyèerpaná pamä» serveraServer odmietol oprávnenieServer odmietol overenieServname nie je pre ai_socktype podporovanáNastavi» názov programuZastavi» serverSignál 0Socketová operácia na objekte, ktorý nie je socketTyp socketu nie je podporovanýSoftware spôsobil zru¹enie spojeniaBohu¾iaµ - nie ste superu¾ívateµ +-Zdrojové definície sa nachádzajú v SÚBOReChyba srmountChyba zásobníkaZastaralý odkaz na NFS súborSpusti» POÈET vlákienStav : %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ÚspechPotlaèi» varovné a informaèné správySymbolické názvy znakov sú definované v SÚBOReChyba systémuSystémové informácie:Pridelenie systémových zdrojov zlyhaloSystémový adresár pre mapy znakov: : %s +- mapy repertoárov: %s +- cestu locale : %s +-%sTABU¥KA +-Typ tabuµky : %s +-Doèasná chyba pri rie¹ení názvuUkonè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¹alPriveµa atribútovPriveµa úrovní symbolických odkazovPriveµa odkazovPriveµa otvorených súborovPriveµa otvorených súborov v systémePriveµa procesovPriveµa odkazov - nie je mo¾né rozdeli»Priveµa pou¾ívateµovTrasovacie/ladiace preru¹enieKoncové spätné lomítkoPrekladací program skonèilKoncový 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 +-NEZNAMYNie je mo¾né overi» toto¾nos» NIS+ klientaNie je mo¾né overi» toto¾nos» NIS+ serveraNie je mo¾né vytvori» spätné volanieNie je mo¾né vytvori» proces na serveriNeznáme (typ = %d, bitov = %d) +-Neznáme kµúèové slovo v .netrc: %sNeznámy chybový kód NISNeznáma databáza %s +-Neznáma chybaNeznáma chyba Neznámy poèítaèNeznámy objektNeznáma voµba: %s %s %sNeznáma chyba resolveraNeznáma chyba serveraNeznámy signál %dNeznáma chyba systémuNeznáma chyba ypbindNepárová ( or \(Nepárová ) or \)Nepárová [ or [^Nepárová \{Nerozpoznaná premenná `%s'Urgentný V/V stavPou¾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 1Pou¾ívateµom definovaný signál 2Hodnota je pre daný dátový typ priveµkáVypr¹al virtuálny èasovaèÈudný výsledok vykonania programuOkno sa zmeniloVypísa» názvy dostupných znakových sádVypí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 slovZapísa» výstup do súboru SÚBORAutor: %s. +-Chybný typ médiaX500XCHSYPBINDPROC_DOMAIN: %s +-Áno, 42 je význam ¾ivotaTentokrát si to skutoène poondialKoncový è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 znakai_family nie je podporovanáai_socktype nie je podporovanýu¾ be¾íargument pre <%s> musí by» jeden znakargument pre `%s' musí by» jeden znakauth_none.c - Fatálna chyba marshallinguauthunix_create: nedostatok pamäti +-chybný argumentchybný vlastníkprázdne pole OD v riadku Linkprázdne pole DO v riadku Linkblok 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äticache_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 èasenie 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é údajenie je mo¾né vytvori» interný deskriptornie je mo¾né vytvori» interné deskriptorynie je mo¾né povoli» socketu prijíma» spojenia: %snie 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 %dnie je mo¾né vlo¾i» element triedenia `%.*s'nie je mo¾né vklada» do výslednej tabuµkynie je mo¾né vlo¾i» nový symbol triedenia: %snie je mo¾né naèíta» profilovacie údajenie je mo¾né otvori»nie je mo¾né otvori» databázový súbor `%s': %snie 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úbornie 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 poradianie 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álnenie je mo¾né èíta» od klientanie 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é údajenie je mo¾né vykona» stat() súboru `%s': %snie je mo¾né zapísa» výstupné súbory do `%s'nie je mo¾né zapísa» výsledok: %snie 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 nie je definovaný v znakovej sadeznak `%s' nie je definovaný a je potrebný ako implicitná hodnotatrieda 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 triedeniaspojenie s adresou %s: oèakávaná kon¹tanta alebo identifikátorkonverzia z `%s' do `%s' nie je podporovanákonverzia zastavená kvôli problému pri zápise výstupunebolo 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 znakduplicitné meno znaku `%s'duplicitná definícia elementu triedeniaduplicitná definícia znaku `%.*s'duplicitný kµúèduplicitná definícia sadyduplicitné meno zóny %s (súbor "%s", riadok %d)duplicitný identifikátor správyduplicitné èíslo správyprázdny znakový re»azecprá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ýstupukódovanie pôvodného textukoncový 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úboruchyba poèas zatvárania súboru profilovacích údajovchyba poèas vkladania elementu triedenia do hash-tabuµkychyba poèas vkladania do hash-tabuµkypoèas èítania vstupupre `copy' je oèakávaný re»azcový argymentoèakávaný pokraèovací riadok nebol nájdenýnepodarilo sa naèíta» zdieµaný objekt `%s'nepodarilo sa naèíta» symbolické údajenepodarilo sa mmap-ova» súbor profilovacích údajovnepodarilo sa od¹tartova» konverziuchyba poèas zápisu údajov kategórie `%s'fcntl: F_SETFDpole `%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»azecfstat sa nepodarilsmetie za koncom ¹pecifikácie kódu znakusmetie za koncom èíslasmetie 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 tikmiget_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ý odkazneprípustné pole CORRECTION v riadku Leapneprípustné pole Rolling/Stationary v riadku Leapneprípustný znak v re»azcineprípustný znak v súbore: neprípustný element triedenianeprípustná definíciazadané neprípustné kódovaniechybná escape-sekvencia na konci re»azcaneprípustná vstupná sekvencia na pozícii %ldneprípustné mená pre rozsah znakovchybný nettype :'%s' +-neprípustné èíslo pre posunutie v re»azci %d poµa `era' kategórie `%s'neprípustné èíslo sadyneprí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 %dlimit implementácie: maximálne mno¾stvo sád znakov je %dnekompletný znak alebo preraïovacia sekvencia na konci vyrovnávacej pamätinesprávne formátovaný súborvstupný riadok neznámeho typuvnútorná chyba (nesprávny deskriptor)vnútorná chyba - addtype zavolaný s chybným isdstvnútorná chyba - addtype zavolaný s chybným ttisgmtvnútorná chyba - addtype zavolaný s chybným ttisstdvnútorná chyba %s na riadku %uneprípustné posunutie voèi UTCneprípustný formát skratkyneprípustný deò mesiacaneprípustný koncový rokneprípustný priestupný rokneprípustný mód pre dlopen()neprípustný názov mesiacaneprípustný ulo¾ený èasneprípustný poèiatoèný rokneprípustný èas v dnineprípustný názov dòadå¾ka kµúèa v ¾iadosti príli¹ dlhá: %Zdriadok za pokraèovaním musí obsahova» definíciu znakuriadok pred pokraèovaním neobsahuje definíciu pre znakovú kon¹tantupridlhý riadokvypí¹ v¹etky známe znakové sadysúbor národného prostredia `%s' pou¾itý v príkaze `copy' nebol nájdenýlstat zlyhalnesprávny riadok ignorovanýzlyhalo mapovanie tabuµky re»azcov hlavièky sekciezlyhalo mapovanie hlavièiek sekciepamä» pred prideleným blokom prepísaná +-pamä» za koncom prideleného bloku prepísaná +-nedostatok pamätinedostatok 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é pravidlonie je ¹pecifikované pôvodné ani cieµové kódovanienetname2user: (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 0program %d nebol nikdy registrovaný +-nezadaná alebo hodnotapre pole `%s' v kategórii `%s' neexistuje správny regulérny výraz: %ss pravidlom sa nezhoduje ¾iadny deò v mesiacineexistuje definícia pre `UNDEFINED'nebol zadaný názov súboru pre profilovacie údaje a zdieµaný objekt `%s' nemá sonamepri pou¾ití `copy' nemá by» zadané ¾iadne iné kµúèové slovový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é menonebolo zadané ¾iadne symbolické meno pre koniec rozsahusymbol `%s' nemá definovanú váhunie je regulérny súbornscd konfigurácia: +- +-%15d ladiaca úroveò servera +-nscd nebe¾í! +-po definícii CHARMAP mô¾u nasledova» iba definície WIDTHpôvodné kódovanie nebolo zadané pomocou `-f'výstupný súborpmap_getmaps rpc problémpoll: chyba protokolu poèas prípravy okruhu +-chyba preprocesoravypísa» zoznam ciest poètov a poèet ich pou¾itívypisova» informáciu o postupeproblé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 sekundysú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 portmapperomrovnaké meno pravidla vo viacerých súborochneúplné èítanie kµúèa ¾iadosti: %sneúplné èítanie ¾iadosti: `%s'neúplný zápis v %s: %ssocket: 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ýstupneprí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 zobrazeniepoèiatoèný rok primalý pre zobrazenieneprípustný koncový dátum v re»azci %d v poli `era' kategórie `%s'svc_run: - select zlyhalsvc_tcp.c - nie je mo¾né vykona» getsockname alebo listensvc_tcp.c - problém pri vytváraní tcp socketusvc_tcp: makefd_xprt: nedostatok pamäti +-svc_unix.c - problém pri vytváraní AF_UNIX socketusvc_unix.c - nemô¾em vykona» getsockname alebo listensvc_unix: makefd_xprt: nedostatok pamäti +-svctcp_create: nedostatok pamäti +-svcudp_create - nemô¾em vykona» getsocknamesvcudp_create: nedostatok pamäti +-svcudp_create: problém pri vytváraní socketusvcunix_create: nedostatok pamäti +-symbol pre viacznakový element triedenia `%.*s' duplikuje definíciu elementusymbol pre viacznakový element triedenia `%.*s' duplikuje iný elementsymbol pre viacznakový element triedenia `%.*s' duplikuje definíciu iného symbolusymbol pre viacznakový element triedenia `%.*s' duplikuje definíciu symbolusymbol pre viacznakový element triedenia `%.*s' duplikuje symbolické meno v znakovej sadechyba syntaxe v definícii %s: %schyba syntaxe v direktíve `order_start'chyba syntaxe v definícii triedy znakovchyba syntaxe v definície konverzie znakovchyba syntaxe v definícii poradia triedeniachyba syntaxe v definícii triedeniachyba syntaxe v definícii kategórie LC_CTYPEchyba syntaxe v definícii novej triedy znakovchyba syntaxe v definícii novej znakovej sadychyba syntaxe v definícii národného prostredia správchyba syntaxe v definícii národného prostredia peòa¾ných hodnôtchyba syntaxe v definícii národného prostredia pre èíslachyba syntaxe v ¹pecifikácii poradiachyba syntaxe v prológu: %schyba syntaxe v definícii mapy repertoáru: %schyba syntaxe v definícii národného prostredia pre èaschyba syntaxe: nie je vnútri sekcie definície národného prostrediakódovanie cieµa nebolo zadané pomocou `-t'toto je prvá definíciaèas men¹í ako nulapreteèenie èasuprimálo bajtov v kódovaní znakupriveµa bajtov v kódovaní znakupriveµa definovaných tried znakovpriveµa priestupných sekúndpriveµa lokálnych typov èasupriveµa prechodov?!priveµa váhpríli¹ veµa alebo príli¹ dlhé skratku èasovej zónysmetie na konci riadkuproblémy pri odpovedi programu %d +-dva riadky za sebou obsahujúce `...' nie sú povolenézadaný jeden roknie je mo¾né prideli» vyrovnávaciu pamä» pre vstupnie je mo¾né uvoµni» argumentynedefinovanéneznámy znak `%s'neznámy znak v poli `%s' kategórie `%s'neznáma direktíva triedenianeznáma direktíva `%s' - riadok ignorovanýneznáma iconv() chyba %dneznáma sada `%s'neznámy symbol `%.*s' - riadok ignorovanýzóna bez pravidielneukonèená správaneukonèený re»azecneukonèená re»azcová kon¹tantaneukonèené symbolické menoneukonèené meno váhyhorný limit rozsahu je men¹í ako dolnýpou¾itie: %s vstupný_súbor +-29. február pou¾itý v nepriestupnom rokuhodnota pre %s musí by» celé èíslohonota pre <%s> musí by» medzi 1 a 4hodnota poµa `%s' kategórie `%s' nesmie by» prázdny re»azechodnota musí by» väè¹ia ako hodnota hodnota poµa `int_curr_symbol' kategórie `LC_MONETARY' nezodpovedá platnému menu v ISO 4217hodnota poµa `int_curr_symbol' kategórie `LC_MONETARY' má chybnú då¾kuhodnoty poµa `%s' kategórie `%s' musia by» men¹ie ako 127poèas prijatia spojenia: %spoèas pridelenia záznamu cachepoèas pridelenia záznamu hash-tabuµkypoèas pridelenia kópie kµúèapoèas otvárania starého katalógupoèas prípravy výstupupoèas èítania databázypoèas stat-u súboru profilovacích informáciípoèas zápisu databázyneúplný zápiszapisovateµný nielen pre vlastníkachybný poèet argumentovchybný poèet polí v riadku Leapchybný poèet polí v riadku Linkchybný poè¹t polí v riadku Rulechybný poèet polí v pokraèovacom riadku Zonechybný poèet polí v riadku Zonexdr_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ôKMLEUL&›L(ÂLëLüLM&M5MIMdM~Mn’MOO"%O"HOkO:‡OÂOËOÔOêOPP2PLPePPšP¶PÐPíPQ#Q*Q EQRQYQ3kQ3ŸQ4ÓQ.R%7R]R&qR%˜R¾R%ÕR3ûR,/S)\S†S"ŸS!ÂSäSûST.TDT"ZT*}T¨T&ÂT&éT&U&7U&^U…U U$¾UãUþUV,2V_V%}V,£V-ÐV þV&WFWeW„WžW²WÒW‰òW2|X¯X"ÊX4íX"Y#4Y XY=bY Y<±YîY'Z6Z)?Z(iZ ’Z³ZµZ½Z$ÎZóZ) +-[(4[][ m[y[#[/´[ä[ö[ \ \%\9\ N\Z\j\\ ›\¨\¾\ Õ\ á\ë\ï\ ]&]-<]!j]Œ]ª]È]ß]&ÿ]%&^0L^!}^Ÿ^-·^å^%_)(_'R_%z_& _Ç_ã_ ý_ +-`%`<`X`u`@Ž`DÏ`a'a@a Ua=_aaÇ·ab7žb2Öb- c7c$Jc +-oczc€c!„c¦c·cÐcícdd/dJd^drd3†d-ºd2ède,e5e;jzjƒj‡jšj!®j Ðj!Ýjÿj.kMk ak nk"{kžk±kÄk Úkäk+ük(lElVlmlŠl¤l¼lØlðl +-m1m$Mmrm„mŸm´mÏm çmômn +-n#n*n20ncnrn‹n šn¨nÄnÚnón oo!3oUosos“op*pCp]pnppžp±pÅpÝpópq qq9qVqnq„q,q +-ÊqÕq Üqéqr#r>rXrprr#¢rÆrÖrírs#&sJsjssss s²sÊsÝsæsöst1tPtptt™t¨tÂtÕtôtu*#uNuUumu‰u ™u!£u ÅuÏuéu v"v @vMvavrvƒv v(¾vçvww5wOwew~wŽw w´w½wÓwãw.ów"x 4x#Bx0fx%—x½xÑxçxøx y#y@yOymy„y›yºyØyÝyðyz+zEz_zqzƒzz·zÐzìz! {.{G{b{~{—{µ{"Î{ ñ{þ{ |$|8|J|`|-o|-|!Ë|í|}}2}C}2Z}#} ±}¾};Ò}~$~@~X~ r~ €~¡~¿~Ð~Ö~ð~/J&cŠŸ´½Ü ö€$0€ U€ c€o€…€š€²€º€Ë€߀ô€ *((S |‰"ƒÀD‚K‚$e‚ +-Š‚•‚«¤‚P„ `„n„!‚„¤„³„Ç„å„"ø„…*…@…S…'c…#‹…6¯… æ… +-ô…ÿ…"†"*†M†"g†Š†ª†ĆÛ† ñ†ÿ† ‡‡*‡C‡Z‡o‡‡–‡«‡½‡χ á‡î‡ ˆˆ#%ˆ:Iˆ„ˆšˆ%°ˆÖˆ"숉!‰ @‰"a‰ „‰¥‰¿‰ωá‰æ‰ë‰Š!ŠF>Š …Š.Š-¾Š6ìŠ8#‹;\‹I˜‹â‹ú‹Œ+$Œ+PŒ'|Œ¤Œ ÄŒ ьیùŒ&(.O&~¥,µâŽCŽ#aŽ…Ž¤Ž!ÀŽ"âŽ. 4%U;{&·Þ1þ0 KW"h‹'§Ïç.‘3‘"J‘(m‘-–‘Ä‘Ü‘!ù‘’8’X’t’!’²’Ê’æ’9ý’47“8l“+¥“8Ñ“$ +-”"/”!R”.t”£””á”<•;>•$z•Ÿ•·•*ו7–:–"Y–|–)–N¹–U—^—&|—)£— Í—Û—+ô— ˜>˜X˜j˜"Š˜%­˜*Ó˜*þ˜)™=™0W™ˆ™§™+Ç™7ó™#+šOš!mš$š!´šÖš&ñš%›,>›k›'z›%¢›0È›2ù› ,œ.9œhœKœLÍœLg+{2§2Ú/ ž$=žbž%xž-žž$Ìžñž Ÿ'Ÿ:Ÿ(QŸ&zŸ!¡ŸßFÚŸ! B4 Bw ?º <ú 77¡o¡Š¡#¥¡.É¡0ø¡0)¢Z¢x¢‹¢§¢¼¢Тå¢ÿ¢£%£;£O£#d£5ˆ£G¾£ ¤#¤58¤ n¤{¤-’¤!À¤(â¤- ¥9¥J¥'\¥?„¥=Ä¥ ¦.¦ ?¦9`¦;š¦,Ö¦*§#.§R§%l§A’§Ô§ñ§I¨7X¨3¨+Ĩð¨'©!/©Q©.b©‘©C¤©*è© ªª(8ªaª1tª¦ªÁª:ݪ«)6«*`«#‹«¯«$Ï«ô«¬",¬O¬m¬‡¬¤¬>Ĭ­!"­ D­(e­$Ž­³­*É­=ô­H2®{®Š®Eš®&à®(¯'0¯EX¯ž¯(·¯'à¯$°,-°)Z°%„°ª°"È°ë°& ±0±PO±V ±U÷±OM²V²!ô²'³*>³/i³*™³$ij/é³1´/K´){´*¥´)д#ú´µ-9µ&gµ4Žµ(õìµ ¶ ¶#(¶$L¶"q¶”¶ª¶ĶÛ¶.춷;·3X·Œ·#ž·· Û·å·0ü·-¸$I¸n¸‡¸#˜¸ ¼¸ȸݸñ¸¹)¹4B¹w¹Š¹§¹'ǹBï¹D2ºjwºKâº?.»n»»!ª»Ì»æ»¼¼"3¼V¼r¼ƒ¼¡¼#»¼#ß¼#½0'½#X½|½š½*¸½%ã½, ¾6¿M¿R`¿B³¿#ö¿$À?ÀUÀjÀ|ÀŽÀ¢À¾ÀØÀƒëÀo “ ´ÂÕÂ7ñ )Ã3Ã;ÃOÃiÇáÃÀÃ"ÞÃÄ"ÄBÄ"`ăÄÄ »ÄÅÄ àÄíÄôÄ6Å6<Å4sÅ3¨Å(ÜÅÆ%Æ @ÆaÆ'vÆ3žÆ*ÒÆ-ýÆ+Ç"FÇ'iÇ‘Ç¬Ç ÉÇêÇÈ'&È4NȃÈ$˜È$½È$âÈ$É$,ÉQÉ"iÉ+ŒÉ¸ÉÓÉïÉ& Ê0Ê&NÊ&uÊ'œÊ ÄÊ'åÊ! Ë/ËOËfËzË“Ë”¬Ë5AÌwÌ!“Ì'µÌÝÌ$íÌÍ>Í YÍ&gÍŽÍ)«Í ÕÍ-áÍ'Î!7ÎYÎ[ÎnÎ"„ΧÎ$¹Î(ÞÎÏ Ï#Ï,;Ï.hÏ—ÏªÏ ÇÏÓÏãÏ ýÏÐ3ÐIÐfÐ +-ЊРР+-ÀÐËÐÓÐ"×ÐúÐ0Ñ6?Ñ#vњѺÑÚÑòÑ1Ò(DÒ,mÒ#šÒ¾Ò6ÙÒ Ó91ÓkÓ;‹Ó(ÇÓ(ðÓ%Ô?ÔUÔ!jԌԣÔÂÔßÔ=óÔJ1Õ|Õ!Õ±Õ ÏÕCÜÕ ÖÌ?Ö ×5*×3`×%”× º×&Æ×í×ö×ü×!Ø"Ø8ØWØi؃ؠؼØØØìØýØ9Ù-LÙ0zÙ«Ù ½ÙËÙÑÙ"áÙÚ<Ú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óqKó ½óÞó#ùóô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.MrÀÓ ê2ô2'$Z­¼Ûø12E,x¥-¹'çF,!s#•¹ Ö#÷9#U*yD¤*é"47l†•"©Ì'æ#+=!i)‹,µ1â.Ll"ˆ«"Ç!ê ) G 7c 3› 6Ï 0 +-97 +-!q +-'“ +-%» +-)á +- ( E <c ;  'Ü  & ,C Ep ¶ &Ö ý . PA S’ æ (%*Pb("ªÍéú!&9+`+Œ¸Ï0é ;$X6}!´Ö#ì$(5!^-€.®*Ý)%A-g6•Ì)ëH.EwD½)5@0v/§/×)1G!y›´Ðå&ý($"MpHˆÑ=é<'BdH§<ð-F"Y0|2­2à,A]sƒ”²ÆÚë#1;=m «#¸+Ü'4>&s%š0À +-ñ ü/ 997s «(¹$â79?+y*¥!Ðò-=<"zI½2(:.c’5®%ä +- 3 Q @a %¢  È Ô ,í !4*!_!|!5Ž!!Ä!-æ!(")="*g"+’"¾"Ø" ÷"#5#Q#o#?#%Ï#%õ#$-5$&c$Š$6ª$Dá$I&% p% |%@ˆ%É%-å%-&?A&&4 &0Õ&"'5)'5_'#•'¹'+Õ'(/(M(Kj(Q¶(P)JY)]¤) *$#*!H*)j**”* ¿*,à*( +.6+)e+&+(¶+#ß+,*,#E,)i,%“, ¹, Ú,è,ü, -#9-]-u--§-.¸-ç-.5&.\.$w.œ. ¹.Å.(×./"/÷DM¢œùÓ>·ÇoiÃ@xµûb ¶ga„Eoe-xWØ؃ZsR"ˆ4/îÁ*Û(äÇ…1 kLVÌN)²‰Ay¹*íf$XQ)#K¤ûÕ[qDáè½TaÄ.ÜùT,'ûu\àê!3ë‹g +-=H]Ó-5Oz»ßj«¬Ú ƒõôïí¿®Á”.¯ø†G’jJZ„R™›C¯3ÿÆ%e`«Ô¡ÉUm{QcP˜«¾òÀƺ6rÍ`ÿ³tôe5‹Fh|›§ìbܱ²ÈeÙ\~2E j¼#š þmÅy ¶1Mö\»4fR ¨×7YŠfL˜FΠª ‰<È¥  Ú’³{iYÏãç÷ %ÿ§(cŽÒ~,Ÿ{é‚ ñC5"Ñ?Ðv)…? +-+/~_"}W|ÛÉdµ¡O"=™R¤Lݽ@uÄ7^ý®8P‡Ãªy` <w}_¨'HdÑnš®ïH”GŽ5>+SÕ-Ý­Yú!©¾Iõgl¼^zßÒvžÞ¹öͤNA|ôtWÏ·+ðƒ$3h̪cèŒb&A´ib[ ¦8Û“ÞOàÔo×Y#róN0——í;n°Ü%‚ñó¼Ëžð E K +-M꿬âh¬XTt ¾^ü9‹M J”âµ>+Š(ì2c±‘6&£œV)†ü›¡¦úU=B•“º;véÊì0Ë€ZüÊï%ɯâ½~]ಘð1¶Np2i':0-DÅ°¸S­ÚÖWL8Óꦟî}¹ç,ø°¸Ðtäö&‘Bw†ælÏIæó‹å6'“ÎçUÙ‰À:*øF‰»– n.…q7éx/Þw;ŸÇž’À&§´G;TZF©g4ˆqò_OKP\–Æ—X•IzÅÂÁ‡G0aAˆBæjUù­€€š<$Ðk¥¢ÎÖ]PhŽ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: must be greater than +-%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 character must not be in class `%s' character not in class `%s'?AbortedAccess Rights : Accessing a corrupted shared libraryAddress already in useAddress family for hostname not supportedAddress family not supported by protocolAdvertise errorAlarm clockArgument list too longAttempt to remove a non-empty tableAttempting to link in too many shared librariesAuthentication OKAuthentication errorBOGUS OBJECT +-Bad addressBad file descriptorBad font file formatBad messageBad system callBad value for ai_flagsBe strictly POSIX conformBinary data +-Block device requiredBroadcast poll problemBroken pipeBus errorCDSCPU time limit exceededCache expiredCan not access a needed shared libraryCan't bind to server which serves this domainCan't communicate with portmapperCan't communicate with ypbindCan't communicate with ypservCannot allocate memoryCannot assign requested addressCannot create socket for broadcast rpcCannot exec a shared library directlyCannot have more than one file generation flag! +-Cannot receive reply to broadcastCannot register serviceCannot send after transport endpoint shutdownCannot send broadcast packetCannot set socket option SO_BROADCASTCannot 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 rangeCharacter Separator : %c +-Child exitedClient credential too weakColumns : +-Communication error on sendCompile locale specificationComputer bought the farmComputing table size for character classes might take a while...Computing table size for collation information might take a while...Connection refusedConnection reset by peerConnection timed outContinuedConvert encoding of given files from one encoding to another.Convert key to lower caseCopyright (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 definitionsCreate output even if warning messages were issuedCreate simple DB database from textual input.Creation Time : %sDES entry for netname %s not unique +-DIRECTORY +-DNANSDNSDatabase for table does not existDatabase is busyDefault Access rights : +-Destination address requiredDevice not a streamDevice not configuredDevice or resource busyDiffie-Hellmann (%d bits) +-Directory : %s +-Directory not emptyDisc quota exceededDo not fork and display messages on the current ttyDo not print messages while building databaseDo not use existing catalog, force new output fileDomain not boundEMT trapENTRY +-Encrypted data +-Entry/Table type mismatchError in RPC subsystemError in accessing NIS+ cold start file. Is NIS+ installed?Error in unknown error system: Error while talking to callback procError: .netrc file is readable by others.Exchange fullExec format errorFATAL: system does not define `_POSIX2_LOCALEDEF'FILE contains mapping from symbolic names to UCS4 valuesFailed (unspecified error)File descriptor in bad stateFile existsFile locking deadlock errorFile name too longFile size limit exceededFile too largeFirst/Next chain brokenFloating point exceptionFull resync required for directoryFunction not implementedGROUP +-Garbage in ARGP_HELP_FMT: %sGenerate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-Generic system errorGet locale-specific information.Give a short usage messageGive this help listGratuitous errorGroup : %s +-Group Flags :Group entry for "%s.%s" group: +-Hang for SECS seconds (default 3600)HangupHaven'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 downHost name lookup failureI/O possibleINPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILEIOT trapIVYIdentifier removedIllegal instructionIllegal object type for operationIllegal seekInappropriate file type or formatInappropriate ioctl for deviceInappropriate operation for background processInformation requestInformation:Input Files:Input/Output format specification:Input/output errorInternal NIS errorInternal ypbind errorInterruptInterrupted system callInterrupted system call should be restartedInvalid Object for operationInvalid argumentInvalid back referenceInvalid character class nameInvalid client credentialInvalid client verifierInvalid collation characterInvalid content of \{\}Invalid cross-device linkInvalid exchangeInvalid or incomplete multibyte or wide characterInvalid preceding regular expressionInvalid range endInvalid regular expressionInvalid request codeInvalid request descriptorInvalid server verifierInvalid slotIs a directoryIs a named type fileKerberos. +-KilledLINK +-LOCAL entry for UID %d in directory %s not unique +-Level 2 haltedLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink Points to illegal nameLink has been severedLink number out of rangeLinked Object Type : Linked to : %s +-Local domain name not setLocal resource allocation failureMachine is not on the networkMalformed Name, or illegal nameMandatory 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 failureMemory exhaustedMessage too longMissing or malformed attributeMod. Time : %sModification failedModify operation failedModify output format:Multihop attemptedNAMENAME +-[-a|-m]NISNIS client/server version mismatch - can't supply serviceNIS map database is badNIS+ operation failedNIS+ servers unreachableNIS+ service is unavailable or not installedNO OBJECT +-NUMBERName : '%s' +-Name Service Cache Daemon.Name not served by this serverName not unique on networkName or service not knownName/entry isn't uniqueNamed object is not searchableNeed authenticatorNetwork dropped connection on resetNetwork is downNetwork is unreachableNo CSI structure availableNo XENIX semaphores availableNo address associated with hostnameNo address associated with nameNo anodeNo buffer space availableNo child processesNo data availableNo file space on serverNo locks availableNo matchNo medium foundNo message of desired typeNo more records in map databaseNo previous regular expressionNo remote programs registered. +-No route to hostNo space left on deviceNo such deviceNo such file or directoryNo such key in mapNo such map in server's domainNo such processNon NIS+ namespace encounteredNon-recoverable failure in name resolutionNone. +-Not Found, no such nameNot a XENIX named type fileNot a directoryNot foundNot master server for this domainNot ownerNumber of Columns : %d +-Number of objects : %u +-Numerical argument out of domainNumerical result out of rangeObject #%d: +-Object Name : %s +-Object Type : Object is remoteObject with same name existsOdd number of quotation marksOnly root is allowed to use this option!Operation already in progressOperation not permittedOperation not supportedOperation now in progressOperation would blockOut of streams resourcesOutput control:Output selection:Owner : %s +-PRIVATE +-Package not installedParse error: %sPartial SuccessPassed object is not the same object on serverPermission deniedPower failurePremature end of regular expressionPrint content of database file, one entry a linePrint current configuration statisticPrint more messagesPrint program versionProbable successProbably not foundProfiling timer expiredProtocol driver not attachedProtocol errorProtocol family not supportedProtocol not availableProtocol not supportedProtocol wrong type for socketQuery illegal for named tableQuitRFS specific errorRPC bad procedure for programRPC failure on NIS operationRPC program not availableRPC program version wrongRPC struct is badRPC version wrongRPC: (unknown error code)RPC: Authentication errorRPC: Can't decode resultRPC: Can't encode argumentsRPC: Failed (unspecified error)RPC: Incompatible versions of RPCRPC: Port mapper failureRPC: Procedure unavailableRPC: Program not registeredRPC: Program unavailableRPC: Program/version mismatchRPC: Remote system errorRPC: Server can't decode argumentsRPC: SuccessRPC: Timed outRPC: Unable to receiveRPC: Unable to sendRPC: Unknown hostRPC: Unknown protocolRSA (%d bits) +-RTLD_NEXT used in code not dynamically loadedRead and display shared object profiling dataRead configuration data from NAMERead-only file systemReal-time signal %dRegular expression too bigRemote I/O errorRemote address changedRemove password or make file unreadable by others.Reopening shared object `%s' failedReplicate : +-Report bugs to %s. +-Report bugs using the `glibcbug' script to . +-Request arguments badResolver Error 0 (no error)Resolver internal errorResource deadlock avoidedResource lostResource temporarily unavailableResults Sent to callback procSHOBJ [PROFDATA]SUNYPSearch Path : %s +-Segmentation faultServer busy, try againServer out of memoryServer rejected credentialServer rejected verifierServname not supported for ai_socktypeSet the program nameShut the server downSignal 0Socket operation on non-socketSocket type not supportedSoftware caused connection abortSorry. You are not root +-Source definitions are found in FILESrmount errorStack faultStale NFS file handleStart NUMBER threadsStatus : %s +-StoppedStopped (signal)Stopped (tty input)Stopped (tty output)Streams pipe errorStructure needs cleaningSuccessSuppress warnings and information messagesSymbolic character names defined in FILESystem errorSystem information:System resource allocation failureSystem's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%sTABLE +-Table Type : %s +-Temporary failure in name resolutionTerminatedText file busyThe 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 expiredToo Many AttributesToo many levels of symbolic linksToo many linksToo many open filesToo many open files in systemToo many processesToo many references: cannot spliceToo many usersTrace/breakpoint trapTrailing backslashTranslator diedTransport endpoint is already connectedTransport endpoint is not connectedTry `%s --help' or `%s --usage' for more information. +-Trying %s... +-Type : %s +-UNKNOWNUnable to authenticate NIS+ clientUnable to authenticate NIS+ serverUnable to create callbackUnable to create process on serverUnknown (type = %d, bits = %d) +-Unknown .netrc keyword %sUnknown NIS error codeUnknown database: %s +-Unknown errorUnknown error Unknown hostUnknown objectUnknown option: %s %s %sUnknown resolver errorUnknown server errorUnknown signal %dUnknown system errorUnknown ypbind errorUnmatched ( or \(Unmatched ) or \)Unmatched [ or [^Unmatched \{Unrecognized variable `%s'Urgent I/O conditionUsage:Usage: %s variable_name [pathname] +-Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-User defined signal 1User defined signal 2Value too large for defined data typeVirtual timer expiredWild result from command executionWindow changedWrite names of available charmapsWrite names of available localesWrite names of selected categoriesWrite names of selected keywordsWrite output to file NAMEWritten by %s. +-Wrong medium typeX500XCHSYPBINDPROC_DOMAIN: %s +-Yes, 42 is the meaning of lifeYou really blew it this timeZone 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 characterai_family not supportedai_socktype not supportedalready runningargument to <%s> must be a single characterargument to `%s' must be a single characterauth_none.c - Fatal marshalling problemauthunix_create: out of memory +-bad argumentbad ownerblank FROM field on Link lineblank TO field on Link lineblock freed twice +-bogus mcheck_status, library is buggy +-broadcast: ioctl (get interface configuration)broadcast: ioctl (get interface flags)buffer overflowcache_set: could not allocate new rpc_buffercache_set: victim alloc failedcache_set: victim not foundcan't determine time zone abbreviation to use just after until timecan't reassign procedure number %d +-cannot `stat' locale file `%s'cannot allocate symbol datacannot create internal descriptorcannot create internal descriptorscannot enable socket to accept connections: %scannot find C preprocessor: %s +-cannot find any C preprocessor (cpp) +-cannot handle old request version %d; current version is %dcannot insert collation element `%.*s'cannot insert into result tablecannot insert new collating symbol definition: %scannot load profiling datacannot opencannot open `%s'cannot open database file `%s': %scannot open input file `%s'cannot open locale definition file `%s'cannot open output filecannot open output file `%s'cannot open output file `%s' for category `%s'cannot open socket: %scannot process order specificationcannot read character map directory `%s'cannot read configuration file; this is fatalcannot read from clientcannot read header from `%s'cannot read locale directory `%s'cannot read locale file `%s'cannot read repertoire map `%s'cannot read statistics datacannot stat() file `%s': %scannot write output files to `%s'cannot write result: %scannot write statistics: %scannot write to clientcategory data requested more than once: should not happencharacter %s'%s' in class `%s' must be in class `%s'character %s'%s' in class `%s' must not be in class `%s'character not defined in character mapcharacter `%s' not defined while needed as default valuecharacter class `%s' already definedcharacter map `%s' already definedcharacter map file `%s' not foundclnt_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 linecollation symbol `%.*s' appears more than once: ignore linecollation symbol expected after `%s'connect to address %s: constant or identifier expectedconversion from `%s' to `%s' not supportedconversion stopped due to problem in writing the outputcouldn't create an rpc server +-couldn't register prog %d vers %d +-database [key ...]default character map file `%s' not founddirection 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 characterduplicate character name `%s'duplicate collating element definitionduplicate definition for character `%.*s'duplicate keyduplicate set definitionduplicate zone name %s (file "%s", line %d)duplicated message identifierduplicated message numberempty char stringempty weight name: line ignoredenablecache: cache already enabledenablecache: could not allocate cacheenablecache: could not allocate cache dataenablecache: could not allocate cache fifoencoding for outputencoding of original textend point of ellipsis range is bigger then starterror while closing input `%s'error while closing output fileerror while closing the profiling data fileerror while inserting collation element into hash tableerror while inserting to hash tableerror while reading the inputexpect string argument for `copy'expected continuation line not foundfailed to load shared object `%s'failed to load symbol datafailed to mmap the profiling data filefailed to start conversion processingfailure while writing data for category `%s'fcntl: F_SETFDfield `%s' in category `%s' not definedfield `%s' in category `%s' undefinedfile '%s' already exists and may be overwritten +-from-value of `collating-element' must be a stringfstat failedgarbage at end of character code specificationgarbage at end of numbergarbage 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 graphgenerate flat profile with counts and ticksget_myaddress: ioctl (get interface configuration)getent - get entries from administrative database.handle_request: request received (Version = %d)hard link failed, symbolic link usedhard linked somewhereillegal CORRECTION field on Leap lineillegal Rolling/Stationary field on Leap lineillegal character constant in stringillegal character in file: illegal collation elementillegal definitionillegal encoding givenillegal escape sequence at end of stringillegal input sequence at position %ldillegal names for character rangeillegal nettype :'%s' +-illegal number for offset in string %d in `era' field in category `%s'illegal set numberillegal 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 allowedimplementation limit: no more than %d character maps allowedincomplete character or shift sequence at end of bufferincorrectly formatted fileinput line of unknown typeinternal error (illegal descriptor)internal error - addtype called with bad isdstinternal error - addtype called with bad ttisgmtinternal error - addtype called with bad ttisstdinternal error in %s, line %uinvalid UTC offsetinvalid abbreviation formatinvalid day of monthinvalid ending yearinvalid leaping yearinvalid mode for dlopen()invalid month nameinvalid saved timeinvalid starting yearinvalid time of dayinvalid weekday namekey length in request too long: %Zdline after ellipsis must contain character definitionline before ellipsis does not contain definition for character constantline too longlist all known coded character setslocale file `%s', used in `copy' statement, not foundlstat failedmalformed line ignoredmapping of section header string table failedmapping of section headers failedmemory clobbered before allocated block +-memory clobbered past end of allocated block +-memory exhaustedmemory 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 ruleneither original nor target encoding specifiednetname2user: (nis+ lookup): %s +-netname2user: DES entry for %s in directory %s not uniquenetname2user: LOCAL entry for %s in directory %s not uniquenetname2user: missing group id list in '%s'.netname2user: principal name '%s' too longnetname2user: should not have uid 0never registered prog %d +-no or value givenno correct regular expression for field `%s' in category `%s': %sno day in month matches ruleno definition of `UNDEFINED'no filename for profiling data given and shared object `%s' has no sonameno other keyword shall be specified when `copy' is usedno output file produced because warning were issuedno repertoire map specified: cannot proceedno symbolic name givenno symbolic name given for end of rangeno weight defined for symbol `%s'not regular filenscd configuration: +- +-%15d server debug level +-nscd not running! +-only WIDTH definitions are allowed to follow the CHARMAP definitionoriginal encoding not specified using `-f'output filepmap_getmaps rpc problempoll: protocol failure in circuit setup +-preprocessor errorprint list of count paths and their number of useprint progress informationproblems 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 momentrepertoire map file `%s' not foundrpcgen: 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 portmappersame rule name in multiple filesshort read while reading request key: %sshort read while reading request: %sshort write in %s: %ssocket: protocol failure in circuit setup +-sorting order `forward' and `backward' are mutually exclusivespecification of sorting weight for collation symbol does not make sensestandard inputstandard outputstarting date is illegal in string %d in `era' field in category `%s'starting year greater than ending yearstarting year too high to be representedstarting year too low to be representedstopping date is illegal in string %d in `era' field in category `%s'svc_run: - select failedsvc_tcp.c - cannot getsockname or listensvc_tcp.c - tcp socket creation problemsvc_tcp: makefd_xprt: out of memory +-svc_unix.c - AF_UNIX socket creation problemsvc_unix.c - cannot getsockname or listensvc_unix: makefd_xprt: out of memory +-svctcp_create: out of memory +-svcudp_create - cannot getsocknamesvcudp_create: out of memory +-svcudp_create: socket creation problemsvcunix_create: out of memory +-symbol for multicharacter collating element `%.*s' duplicates element definitionsymbol for multicharacter collating element `%.*s' duplicates other element definitionsymbol for multicharacter collating element `%.*s' duplicates other symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbol definitionsymbol for multicharacter collating element `%.*s' duplicates symbolic name in charsetsyntax error in %s definition: %ssyntax error in `order_start' directivesyntax error in character class definitionsyntax error in character conversion definitionsyntax error in collating order definitionsyntax error in collation definitionsyntax error in definition of LC_CTYPE categorysyntax error in definition of new character classsyntax error in definition of new character mapsyntax error in message locale definitionsyntax error in monetary locale definitionsyntax error in numeric locale definitionsyntax error in order specificationsyntax error in prolog: %ssyntax error in repertoire map definition: %ssyntax error in time locale definitionsyntax error: not inside a locale definition sectiontarget encoding not specified using `-t'this is the first definitiontime before zerotime overflowtoo few bytes in character encodingtoo many bytes in character encodingtoo many character classes definedtoo many leap secondstoo many local time typestoo many transitions?!too many weightstoo many, or too long, time zone abbreviationstrailing garbage at end of linetrouble replying to prog %d +-two lines in a row containing `...' are not allowedtyped single yearunable to allocate buffer for inputunable to free argumentsundefinedunknown character `%s'unknown character in field `%s' of category `%s'unknown collation directiveunknown directive `%s': line ignoredunknown iconv() error %dunknown set `%s'unknown symbol `%.*s': line ignoredunruly zoneunterminated messageunterminated stringunterminated string constantunterminated symbolic nameunterminated weight nameupper limit in range is not smaller then lower limitusage: %s infile +-use of 2/29 in non leap-yearvalue for %s must be an integervalue for <%s> must lie between 1 and 4value for field `%s' in category `%s' must not be the empty stringvalue of must be greater than the value of value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217value of field `int_curr_symbol' in category `LC_MONETARY' has wrong lengthvalues for field `%s' in category `%s' must be smaller than 127while accepting connection: %swhile allocating cache entrywhile allocating hash table entrywhile allocating key copywhile opening old catalog filewhile preparing outputwhile reading databasewhile stat'ing profiling data filewhile writing database filewrite incompletewriteable by other than ownerwrong number of argumentswrong number of fields on Leap linewrong number of fields on Link linewrong number of fields on Rule linewrong number of fields on Zone continuation linewrong number of fields on Zone linexdr_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 +-Language-Team: Swedish +-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: måste vara större än +-%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-tecknet får inte vara i klass "%s"-tecknet är inte i klass "%s"?Avbruten (SIGABRT)Åtkomsträttigheter : Öppnar ett korrupt delat bibliotekAdressen upptagenAdressfamilj för värdnamn stöds inteAdressfamiljen stöds inte av protokolletAnnonseringsfelAlarmklockaArgumentlistan för långFörsök att ta bort en tabell som inte är tomFörsök att länka in för många delade bibliotekÄkthetskontroll OKÄkthetskontroll misslyckadesSKENOBJEKT +-Felaktig adressFelaktig filidentifierareFelaktigt format på typsnittsfilFelaktigt meddelandeFelaktigt systemanropOtillåtet värde för ai_flagsVar strikt POSIX-konformBinärdata +-Blockspecialfil krävsProblem med poll vid utsändningBrutet rörBussfelCDSBegränsning av CPU-tid överskridenCache gick ur tidenKan inte komma åt ett nödvändigt delat bibliotekKan inte ansluta till servern som betjänar denna domänKan inte kommunicera med portmapperKan inte kommunicera med ypbindKan inte kommunicera med ypservKan inte allokera minneKan inte tilldela begärd adressKan inte skapa uttag (socket) för utsändnings-rpcKan inte köra ett delat bibliotek direktKan inte ha mer än en filgenereringsflagga! +-Kan inte ta emot svar på utsändningKan inte registrera tjänstKan inte skicka efter att transportslutpunkten stängtsKan inte skicka utsändningspaketKan inte sätta uttagsflaggan (socket option) SO_BROADCASTKan 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 intervallTeckenseparator : %c +-Barnprocess avslutadKlientens referenser är för svagaKolumner : +-Kommunikationsfel vid sändningKompilera lokalspecifikationDatorn packade ihopAtt beräkna tabellstorlek för teckenklasser kan ta ett tag...Att beräkna tabellstorlek för kollationeringsinformation kan ta ett tag...Förbindelse vägrasFörbindelse borttagen av partnernFörbindelsen dog ut (timeout)ÅterupptagenKonvertera kodning i angivna infiler från en kodning till en annan.Konvertera nyckel till gemenerCopyright © %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 symboldefinitionerSkapa utfil även om varningsmeddelanden genereradesSkapa enkel DB-databas från textdata.Skapad : %sDES-post för nätnamn %s är inte unikt +-KATALOG +-DNANSDNSDatabas för tabell existerar inteDatabasen är upptagenStandard åtkomsträttigheter : +-Destination krävsEnheten är inte en streamEnheten är inte konfigureradEnhet eller resurs upptagenDiffie-Hellmann (%d bitar) +-Katalog : %s +-Katalog inte tomDiskkvot överskridenSkapa inte barnprocess, visa meddelanden på nuvarande ttySkriv inte meddelanden medans databasen byggsAnvänd inte existerande katalog, gör en ny utfilDomän inte bundenEmulatorfällaPOST +-Krypterat data +-Post/Tabell-typer är inkompatibilaFel i RPC delsystemFel vid läsande av NIS+ kallstartsfil. Är NIS+ installerad?Fel i okänt felsystem: Fel vid kommunikation till återanropsprocessFel: .netrc kan läsas av andra.Växeln fullFormatfel på körbar filFATALT: systemet definierar inte "_POSIX2_LOCALEDEF"FIL innehåller avbildning från symboliska namn till UCS4-värdenMisslyckades (ospecificerat fel)Filidentifierare i felaktigt tillståndFilen existerarFillåsning gav dödlägeFilnamn för långtBegränsning av filstorlek överskridenFil för storFörsta/Nästa-kedja brutenAritmetiskt felFullständig resynkronisering krävs för katalogFunktion inte implementeradGRUPP +-Skräp i ARGP_HELP_FMT: %sSkapa meddelandekatalog.\vOm INFIL är - så läses standard in. Om UTFIL +-är - så skrivs resultatet till standard ut. +-Generiskt systemfelHämta lokal-specifik informationGe ett kort hjälpmeddelandeSkriv denna hjälplistaOmotiverat felGrupp : %s +-Gruppflaggor : Grupppost för "%s.%s" grupp: +-Vänta i SEK sekunder (standardvärde 3600)AvringdHittar 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 nereUppslagning av värdnamn misslyckadesI/O möjligtINFIL UTFIL +--o UTFIL INFIL +--u INFILIOT-fällaIVYIdentifierare borttagenOtillåten instruktionOtillåten objekttyp för operationenOtillåten sökningFiltyp eller format olämpligOlämplig "ioctl" för enhetOperation för bakgrundsprocess olämpligInformationsbegäranInformation:Infiler:In/ut formatspecifikation:In/ut-felInternt NIS-felInternt ypbind-felAvbruten (SIGINT)Avbrutet systemanropAvbrutet systemanrop borde omstartasOtillåtet objekt för operationenOgiltigt argumentOgiltig bakåtreferensOgiltigt teckenklassnamnOgiltiga klientreferenserOgiltig klientverifierareOgiltigt kollationeringsteckenOgiltigt innehåll i \{\}Ogiltig länk över skilda enheterOgiltig växelOgiltig eller inte komplett flerbyte- eller brett teckenOgiltigt föregående reguljärt uttryckOgiltigt intervallslutOgiltigt reguljärt uttryckOgiltig åtkomstkodOgiltig frågedeskriptorOgiltig serververifierareOgiltig platsÄr en katalogÄr en namngiven filtypKerberos. +-DödadLÄNK +-LOCAL-post för UID %d i katalog %s är inte unik +-Nivå 2 stannadNivå 2 inte synkroniseradNivå 3 stannadNivå 3 omstartadLänk pekar på ett otillåtet namnLänken har brutitsLänkantal utanför giltigt områdeLänkad objekttyp : Länkad till : %s +-Lokalt domännamn inte sattAllokeringsfel för lokal resursMaskinen finns inte på nätverketFelaktigt namn eller otillåtet namnObligatoriska respektive valfria argument för långa flaggor är obligatoriska repektive valfria även för korta.Huvudserver : +-Huvudserver är upptagen, full dump omskedulerad.MinnesallokeringsfelMinnet slutMeddelandet för långtSaknat eller felaktigt attributÄndr. tid : %sÄndring misslyckadesÄndringsoperation misslyckadesÄndra utdataformat:Flerhopp försöktesNAMNNAMN +-[-a|-m]NISNIS versionsskillnad klient/server - kan inte betjänaNIS tabelldatabas är felaktigNIS+ operation misslyckadesNIS+ servers kan inte nåsNIS+ service är otillgänglig eller inte installeradINGET OBJEKT +-ANTALNamn : "%s" +-Namntjänst cache-demonNamn hanteras inte av denna serverNamnet inte unikt i nätverketNamn eller tjänst okändNamn/post är inte unikNamngivet objekt är inte sökbartBehöver äkthetsintygareNätverket tog bort förbindelsen vid omstartNätverket är nereNätverket kan inte nåsInga CSI-strukturer tillgängligaInga XENIX-semaforer tillgängligaIngen adress associerad med värdnamnIngen adress associerad med namnetIngen anodIngen buffertplats tillgängligInga barnprocesserInga data tillgängligaInget filutrymme hos servernInga lås tillgängligaIngen träffInget medium funnetInget meddelande av önskad typInga fler poster i tabelldatabasenInget föregående reguljärt uttryckInga fjärrprogram registrerade. +-Ingen väg till värdEnheten är fullEnheten finns inteFilen eller katalogen finns inteIngen sådan nyckel i tabellenIngen sådan tabell i serverns domänProcessen finns inteIcke-NIS+ namnrymd påträffadOreparerbart fel i namnuppslagningIngen. +-Inte hittad, inget sådant namnInte en XENIX-namngiven filInte en katalogInte funnetIngen huvudserver för denna domänInte ägareAntal kolumner : %d +-Antal objekt : %u +-Numeriskt argument är utanför områdetNumeriskt resultat är utanför giltigt områdeObjekt #%d: +-Objektnamn : %s +-Objekttyp : Är ett fjärrobjektObjekt med samma namn existerarOjämnt antal citationsteckenBara root har tillåtelse att använda denna operation!Operationen pågår redanOperationen inte tillåtenOperationen stöds inteOperationen pågår nuOperationen skulle blockeraStream-resurserna är slutStyr utdata:Välj utdata:Ägare : %s +-PRIVAT +-Paketet är inte installeratParsfel: %sDelvis lyckatSkickat objekt är inte samma objekt hos servernÅtkomst nekasStrömavbrottFör tidigt slut på reguljärt uttryckSkriv innehållet i databasen, en post per radSkriv ut nuvarande konfigurationsstatistikSkriv mer meddelandenSkriv programversionTroligtvis lyckatFörmodligen inte funnenProfileringsklockaStyrprogram för protokoll inte anslutetProtokollfelProtokollfamiljen stöds ejProtokollet ej tillgängligtProtokollet stöds ejFel protokolltyp för uttag (socket)Fråga ogiltig för namngiven tabellLämnadRFS-specifikt felRPC dålig procedur för programRPC-fel vid NIS-operationRPC programmet ej tillgängligtRPC fel programversionRPC struktur dåligRPC fel versionRPC: (okänd felkod)RPC: Fel vid äkthetskontrollRPC: Kan inte avkoda resultatetRPC: Kan inte koda argumentetRPC: Misslyckades (ospecificerat fel)RPC: Inkompatibla versioner av RPCRPC: Fel i portöversättareRPC: Procedur inte tillgängligRPC: Programmet inte registreratRPC: Programmet otillgängligtRPC: Program/version-inkompatibilitetRPC: FjärrsystemsfelRPC: Server kan inte avkoda argumentenRPC: LyckatRPC: Tiden löpte utRPC: Kan inte ta emotRPC: Kan inte skickaRPC: Okänd värdmaskinRPC: Okänt protokollRSA (%d bitar) +-RTLD_NEXT används i kod som inte är dynamiskt laddadLäs och visa profildata för delat objektLäs konfigurationsdata från NAMNFilsystemet endast läsbartRealtidssignal %dReguljärt uttryck för stortI/O-fel på fjärrmaskinFjärradress ändradesTa bort lösenord eller gör filen oläsbar för andraÖppna delat object "%s" igen misslyckadesReplikerad : +-Rapportera fel till %s. +-Rapportera fel med programmet "glibcbug" till . +-Rapportera fel på översättningen till . +-Argument för förfrågan felaktigaResolver-fel 0 (inget fel)Internt fel i namnlösare (resolver)Resursdödläge undveksFörlorad resursResursen tillfälligt otillgängligResultat skickat till återanropsprocessenSHOBJ [PROFDATA]SUNYPSökväg : %s +-SegmenteringsfelServer upptagen, försök igenServer har slut på minneServer förkastade kreditivServer förkastade verifierareServname stöds inte för ai_socktypeSätt programnamnetAvsluta servernSignal 0Uttagsoperation på icke-uttag (socket)Uttagstyp (socket) stöds inteMjukvara orsakade förbindelsebrottTyvärr, du är inte root +-Källdefinitioner finns i FILESrmount-felStackfelFörlegat NFS-filhandtagStarta ANTAL trådarStatus : %s +-StoppadStoppad (signal)Stoppad (terminalläsning)Stoppad (terminalskrivning)Streams-rörfelStrukturen behöver städasLyckatUndertryck varningar och informationsmeddelandenSymboliska teckennamn definierade i FILESystemfelSysteminformation:Allokeringsfel för systemresursSystemets kataloger för teckentabeller: %s +- repertoartabeller: %s +- lokal-sökväg : %s +-%sTABELL +-Tabelltyp : %s +-Namnuppslagning misslyckades temporärtAvslutadKodfil upptagenFö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 ringdeFör många attributFör många nivåer av symboliska länkarFör många länkarFör många öppna filerFör många öppna filer i systemetFör många processerFör många referenser: kan inte skarvaFör många användareSpårningsfällaAvslutande omvänt snedstreckÖversättaren dogTransportslutpunkten är redan förbundenTransportslutpunkten är inte förbundenFörsök med "%s --help" eller "%s --usage" för mer information +-Provar %s... +-Typ : %s +-OKÄNDKan inte bevisa äkthet hos NIS+ klientKan inte bevisa äkthet hos NIS+ serverKan inte skapa återanropKan inte skapa process hos serverOkänd (typ = %d, bitar = %d) +-Okänt .netrc-nyckelord %sOkänd NIS-felkodOkänd databas: %s +-Okänt felOkänt fel Okänd värdOkänt objektOkänd flagga: %s %s %sOkänt fel hos namnlösare (resolver)Okänt fel hos serverOkänd signal %dOkänt systemfelOkänt ypbind-felObalanserade ( eller \(Obalanserade ) eller \)Obalanserade [ eller [^Obalanserad \{Okänd variabel "%s"Akut I/O-tillståndAnvändning:Användning: %s variabelnamn [sökväg] +-Användning: rpcinfo [ -n portnr ] -u värd prognr [ versnr ] +-Användarsignal 1Användarsignal 2Värdet för stort för definierad datatypAlarmklocka - virtuell tidVilt resultat från kommandokörningÄndrat fönsterSkriv namn på tillgängliga teckenuppsättningarSkriv namn på tilgängliga lokalerSkriv namn på valda kategorierSkriv namn på valda nyckelordSkriv resultatet till NAMNSkriven av %s. +-Fel typ på medietX500XCHSYPBINDPROC_DOMAIN: %s +-Ja, meningen med livet är 42Du strulade till det den här gångenZon-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 teckenai_family stöds ejai_socktype stöds intekör redanargumentet till <%s> måste vara ett enskilt teckenargumentet till "%s" måste vara ett enskilt teckenauth_none.c - Fatalt kodningsproblemauthunix_create: minnet slut +-dåligt argumentolämplig ägaretomt "FROM"-fält på "Link"-radtomt "TO"-fält på "Link"-radblock 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 övercache_set: kunde inte allokera ny rpc-buffertcache_set: offerallokering misslyckadescache_set: offer hittades ejkan inte avgöra tidszonsförkortning att använda just efter "until"-tidkan inte ändra procedurnummer %d +-kan inte ta status på lokalfil "%s"kan inte allokera symboldatakan inte skapa intern deskriptorkan inte skapa interna deskriptorerkan inte få uttag (socket) att acceptera förbindelser: %skan inte hitta C preprocessor: %s +-kan inte hitta någon C preprocessor (cpp) +-Kan inte hantera äldre förfrågansversion %d, nuvarande version är %dkan inte sätta in kollationselement "%.*s"kan inte sätta in i resultattabellkan inte sätta in ny kollationssymbolsdefinition: %skan inte ladda profildatakan inte öppnakan inte öppna "%s"kan inte öppna databasfil "%s": %skan inte öppna infil "%s"kan inte öppna lokaldefinitionsfil "%s"kan inte öppna utfilkan inte öppna utfil "%s"kan inte öppna utfil "%s" för kategori "%s"kan inte öppna uttag (socket): %skan inte bearbeta sorteringsspecifikationkan inte läsa teckenuppsättningskatalog "%s"kan inte läsa konfigurationsdata, detta är fataltkan inte läsa från klientkan 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 statistikdatakan inte ta status på fil "%s": %skan inte skriva utfiler till "%s"kan inte skriva resultat: %skan inte skriva statistik: %skan inte skriva till klientkategoridata begärd mer än en gång: borde inte inträffatecknet %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 inte definierat i teckenuppsättningtecknet "%s" inte definierat men behövs som standardvärdeteckenklass "%s" redan definieradteckenuppsättning "%s" redan definieradteckenuppsättningsfil "%s" finns inteclnt_raw.c - Fatalt fel vid serialiseringclnttcp_create: minnet slut +-clntudp_create: minnet slut +-clntunix_create: minnet slut +-kollationselement "%.*s" finns mer än en gång: rad ignoreradkollationssymbol "%.*s" finns mer än en gång: rad ignoreradkollationssymbol förväntades efter "%s"koppla till adress %s: konstant eller identifierare förväntadkonvertering från "%s" till "%s" stödjs intekonvertering avslutades på grund av problem med att skriva resultatetkunde inte skapa en rpc-server +-kunde inte registrera prog %d vers %d +-databas [nyckel ...]standardteckenuppsättningsfil "%s" inte hittadriktningsflagga 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 teckenduplicerat teckennamn "%s"dubbla definitioner av kollationselementdubbla definitioner för tecken "%.*s"duplicerad nyckelduplicerad definition av mängdduplicerat zonnamn %s (fil "%s", rad %d)duplicerad meddelandeidentifierareduplicerat meddelandenummertom teckensträngtomt viktnamn: rad ignoreradenablecache: cache redan påslagenenablecache: kunde inte allokera cacheenablecache: kunde inte allokera cache-dataenablecache: kunde inte allokera cache-fifokodning för resultatetkodning av originaltextenslutpunkt för intervall är större än startvärdetfel vid stängning av indata "%s"fel vid stängning av utfilenfel vid stängning av profildatafilenfel vid insättning av kollationselement i hashtabellenfel vid insättning i hashtabellenfel när indata lästesförväntar strängargument för "copy"förväntad fortsättningsrad ej funnenmisslyckades att ladda delat objekt "%s"misslyckades att ladda symboldatamisslyckades att mappa (mmap) profildatafilenmisslyckades att starta konverteringsprocessenmisslyckades skriva data för kategori "%s"fcntl_ F_SETFDfält "%s" i kategori "%s" inte definieratfält "%s" i kategori "%s" odefinieratfil "%s" finns redan och kan bli överskriven +-frånvärde för "collating-element" måste vara en strängmisslyckades ta status (fstat)skräp i slutet av teckenkodsspecifikationskräp i slutet av nummerskrä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 anropsgrafgenerera platt profil med antal och tiderget_myaddress: ioctl (hämta gränssnittskonfiguration)getent - hämta poster från administrativ databashandle_request: begäran mottagen (version = %d)hård länk misslyckades, använder symbolisk länkhårdlänkad någonstansotillåtet "CORRECTION"-fält på "Leap"-radotillåtet "Rolling/Stationary"-fält på "Leap"-radotillåten teckenkonstant i strängotillåtet tecken i fil: otillåtet kollationselementotillåten definitionotillåten kodning givenotillåten teckensekvens vid strängslutotillåten indatasekvens vid position %ldotillåtna namn för teckenintervallotillå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ängdotillå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åtnaimplementationsbegränsning: inte fler än %d teckenuppsättningar tillåtetofullständigt tecken eller skift-sekvens i slutet på buffertfelaktigt formaterad radinrad av okänd typinternt fel (otillåten deskriptor)internt fel - addtype anropad med felaktig isdstinternt fel - addtype anropad med felaktig ttisgmtinternt fel - addtype anropad med felaktig ttisstdinternt fel i %s, rad %uogiltigt UTC-tilläggogiltigt förkortningsformatogiltig dag i månadenogiltigt slutårogiltigt skottårogiltiga flaggor för dlopen()ogiltigt månadsnamnogiltigt sparad tidogiltigt startårogiltig tid på dagenogiltigt veckodagsnamnnyckellängd i begäran för lång: %Zdrad efter ellips måste innehålla teckendefinitionrad före ellips innehåller inte definition för teckenkonstantför lång radvisa alla kända teckenuppsättningarlokalfil "%s", använd i "copy", inte funnenmisslyckades ta status (lstat)felaktig rad ignoreradmappning av sektionshuvuds strängtabell misslyckadesmappning av sektionshuvud misslyckadesminnet förstört före allokerat block +-minnet förstört efter slutet på allokerat block +-minne slutminnet slut +-minnet är konsistent, biblioteket är felaktigt +-eraformat i sträng %d i "era"-fält i kategori "%s" saknaseranamn i sträng %d i "era"-fält i kategori "%s" saknasnamnlös regelvarken original- eller målkodning angvetnetname2user: (nis+ uppslagning) %s +-netname2user: DES-post för %s i katalog %s är inte uniknetname2user: LOCAL-post för %s i katalog %s är inte uniknetname2user: fattas grupp-id lista i "%s".netname2user: principalnamn "%s" för långtnetname2user: borde inte ha uid 0aldrig registrerat prog %d +-inget eller värde angivetfelaktigt reguljärt uttryck för fält "%s" i kategori "%s": %singen dag i månaden matchar regelningen definition av "UNDEFINED"inget filnam för profildata angivet och delat objekt "%s" saknar "soname"inget annat nyckelord ska anges när "copy" användsingen utfil skapad på grund av varningaringen repertoarmap angiven: kan inte fortsättainget symboliskt namn givetinget symboliskt namn givet för slutet av intervalletingen vikt definierad för symbol "%s"inte en normal filnscd 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"resultatfilpmap_getmaps rpc problempoll: protokollfel i förbindelseuppsättning +-preprocessorfelskriv lista med räknade vägar och antal användningarskriv information om körningproblem 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ällehittar 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 portmappersamma regel i flera filerfattas data vid läsning av begäransnyckel: %sfattas data vid läsning av begäran: %sofullständig skrivning i %s: %suttag (socket): protokollfel i förbindelseuppsättning +-sorteringsordning "forward" och "backward" är ömsesidigt uteslutandespecifikation av sorteringsvikter för kollationssymbol verkar inte vettigstandard instandard utstartdatum är otillåtet i sträng %d i "era"-fält i kategori "%s"startår är större än slutårstartår för stort för att kunna representerasstartår för litet för att kunna representerasslutdatum är otillåtet i sträng %d i "era"-fält i kategori "%s"svc_run: - select misslyckadessvc_tcp.c - kan inte anropa getsockname eller listensvc_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 listensvc_unix: makefd_xprt: minnet slut +-svctcp_create: minnet slut +-svcudp_create - kan inte anropa getsocknamesvcudb_create: minnet slut +-svcudp_create: problem att skapa uttag (socket)svcunix_create: minnet slut +-symbol för flerteckenskollationselement "%.*s" duplicerar elementdefinitionsymbol för flerteckenskollationselement "%.*s" duplicerar annan +-elementdefinitionsymbol för flerteckenskollationselement "%.*s" duplicerar annan +-symboldefinitionsymbol för flerteckenskollationselement "%.*s" duplicerar symboldefinitionsymbol för flerteckenskollationselement "%.*s" duplicerar symboliskt +-namn i teckenuppsättningsyntaxfel i definition av %s: %ssyntaxfel i direktivet "order_start"syntaxfel i teckenklassdefinitionsyntaxfel i teckenkonverteringsdefinitionsyntaxfel i kollationssorteringsdefinitionsyntaxfel i kollationsdefinitionsyntaxfel i definition av kategorin LC_CTYPEsyntaxfel i definition av ny teckenklasssyntaxfel i definition av ny teckenuppsättningsyntaxfel i definition av meddelandelokalsyntaxfel i definition av monetärlokalsyntaxfel i definition av numerisk lokalsyntaxfel i sorteringsspecifikationsyntaxfel i prolog: %ssyntaxfel i repertoartabellsdefinition: %ssyntaxfel i definition av tidslokalsyntaxfel: inte inne i en lokaldefinitionmålkodning ej angivet med flagga "-t"detta är den första definitionentid före nollför stort tidsvärdeför få byte i teckenkodningför många tecken i teckenkodningför många teckenklasser definieradeför många skottsekunderför många lokala tidstyperför många övergångar?!för många vikterför många eller för långa tidszonförkortningaravslutande skräp vid radslutetproblem att svara till prog %d +-två rader efter varann som har "..." är inte tillåtetsatte typ på endast ett årkan inte allokera buffert för indatakan inte avallokera argumentodefinieradokänt tecken "%s"okänt tecken i fält "%s" i kategori "%s"okänt kollationsdirektivokänt direktiv "%s": rad ignoreradokänt fel från iconv() %dokänd mängd "%s"okänd symbol "%.*s": rad ignoreradbesvärlig zonoavslutat meddelandeoavslutad strängoavslutad strängkonstantoavslutat symboliskt namnoavslutat viktnamnövre gräns i intervall är inte mindre än undre gränsanvändning: %s infil +-använder 29/2 i icke-skottårvärdet på %s måste vara heltalvärde på <%s> måste vara mellan 1 och 4värde på fält "%s" i kategori "%s" får inte vara tom strängvärdet på måste vara större än värdet på värdet på fältet "int_curr_symbol" i kategorin LC_MONETARY stämmer inte med värden i ISO 4217värdet på fältet "int_curr_symbol" i kategorin LC_MONETARY har fel längdvärden på fält "%s" i kategorin "%s" måste vara mindre än 127när förbindelse accepterades: %snär cache-post allokeradesnär hashtabellspost allokeradesnär nyckelkopia allokeradesnär gammal katalogfil öppnadesnär utdata förbereddesnär databasen lästesnär status togs på profildatafilennär databasfilen skrevsofullständing skrivningskrivbar för andra än ägarenfel antal argumentfel antal fält på "Leap"-radfel antal fält på "Link"-radfel antal fält på "Rule"-radfel antal fält på "Zone"-fortsättningsradfel antal fält på "Zone"-radxdr_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 , 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 ++ ++ Win32 hacks from . ++ * posix/glob.c [WIN32]: Don't include ; don't use d_ino; ++ use void * for my_realloc; include for alloca. ++ (glob) [WIN32]: Use "c:/users/default" for ~ if no HOME variable. ++ * posix/fnmatch.h [WIN32]: Use prototypes even if [!__STDC__]. ++ * posix/glob.h: Likewise. ++ ++Fri Jul 19 16:56:41 1996 Roland McGrath ++ ++ * posix/glob.h [!_AMIGA && !VMS]: Check this instead of just [!_AMIGA] ++ for `struct stat;' forward decl. ++ ++Sat Jun 22 10:44:09 1996 Roland McGrath ++ ++ * posix/glob.c: Include only [HAVE_ALLOCA_H], not [sparc]. ++ ++Fri Jun 21 00:27:51 1996 Roland McGrath ++ ++ * posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr ++ only for ?s, not for *s. Fix from Chet Ramey. ++ +diff -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 <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ++ ac_cv_prog_gcc=yes ++else ++ ac_cv_prog_gcc=no ++fi ++fi ++ ++echo "$ac_t""$ac_cv_prog_gcc" 1>&6 ++if test $ac_cv_prog_gcc = yes; then ++ GCC=yes ++ if test "${CFLAGS+set}" != set; then ++ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ echo 'void f(){}' > conftest.c ++if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ++ ac_cv_prog_gcc_g=yes ++else ++ ac_cv_prog_gcc_g=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 ++ if test $ac_cv_prog_gcc_g = yes; then ++ CFLAGS="-g -O" ++ else ++ CFLAGS="-O" ++ fi ++ fi ++else ++ GCC= ++ test "${CFLAGS+set}" = set || CFLAGS="-g" ++fi ++ ++# Extract the first word of "ar", so it can be a program name with args. ++set dummy ar; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$AR"; then ++ ac_cv_prog_AR="$AR" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ++ for ac_dir in $PATH; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_AR="ar" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" ++fi ++fi ++AR="$ac_cv_prog_AR" ++if test -n "$AR"; then ++ echo "$ac_t""$AR" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++# Extract the first word of "ranlib", so it can be a program name with args. ++set dummy ranlib; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$RANLIB"; then ++ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ++ for ac_dir in $PATH; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_RANLIB="ranlib" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" ++fi ++fi ++RANLIB="$ac_cv_prog_RANLIB" ++if test -n "$RANLIB"; then ++ echo "$ac_t""$RANLIB" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ++# On Suns, sometimes $CPP names a directory. ++if test -n "$CPP" && test -d "$CPP"; then ++ CPP= ++fi ++if test -z "$CPP"; then ++if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ # This must be in double quotes, not single quotes, because CPP may get ++ # substituted into the Makefile and "${CC-cc}" will confuse make. ++ CPP="${CC-cc} -E" ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. ++ cat > conftest.$ac_ext < ++Syntax Error ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:715: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ : ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ CPP="${CC-cc} -E -traditional-cpp" ++ cat > conftest.$ac_ext < ++Syntax Error ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:730: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ : ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ CPP=/lib/cpp ++fi ++rm -f conftest* ++fi ++rm -f conftest* ++ ac_cv_prog_CPP="$CPP" ++fi ++ CPP="$ac_cv_prog_CPP" ++else ++ ac_cv_prog_CPP="$CPP" ++fi ++echo "$ac_t""$CPP" 1>&6 ++ echo $ac_n "checking for AIX""... $ac_c" 1>&6 ++cat > conftest.$ac_ext <&5 | ++ egrep "yes" >/dev/null 2>&1; then ++ rm -rf conftest* ++ echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF ++#define _ALL_SOURCE 1 ++EOF ++ ++else ++ rm -rf conftest* ++ echo "$ac_t""no" 1>&6 ++fi ++rm -f conftest* ++ ++ ++ac_safe=`echo "minix/config.h" | tr './\055' '___'` ++echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ MINIX=yes ++else ++ echo "$ac_t""no" 1>&6 ++MINIX= ++fi ++ ++if test "$MINIX" = yes; then ++ cat >> confdefs.h <<\EOF ++#define _POSIX_SOURCE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define _POSIX_1_SOURCE 2 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define _MINIX 1 ++EOF ++ ++fi ++ ++echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 ++if test -d /etc/conf/kconfig.d && ++ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 ++then ++ echo "$ac_t""yes" 1>&6 ++ ISC=yes # If later tests want to check for ISC. ++ cat >> confdefs.h <<\EOF ++#define _POSIX_SOURCE 1 ++EOF ++ ++ if test "$GCC" = yes; then ++ CC="$CC -posix" ++ else ++ CC="$CC -Xp" ++ fi ++else ++ echo "$ac_t""no" 1>&6 ++ ISC= ++fi ++ ++echo $ac_n "checking for working const""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <j = 5; ++} ++{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ ++ const int foo = 10; ++} ++ ++; return 0; } ++EOF ++if { (eval echo configure:893: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_c_const=yes ++else ++ rm -rf conftest* ++ ac_cv_c_const=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_c_const" 1>&6 ++if test $ac_cv_c_const = no; then ++ cat >> confdefs.h <<\EOF ++#define const ++EOF ++ ++fi ++ ++# If we cannot run a trivial program, we must be cross compiling. ++echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_c_cross=yes ++else ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_c_cross=no ++else ++ ac_cv_c_cross=yes ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_c_cross" 1>&6 ++cross_compiling=$ac_cv_c_cross ++ ++echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++#include ++#include ++#include ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:951: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ ac_cv_header_stdc=yes ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++if test $ac_cv_header_stdc = yes; then ++ # SunOS 4.x string.h does not declare mem*, contrary to ANSI. ++cat > conftest.$ac_ext < ++EOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ egrep "memchr" >/dev/null 2>&1; then ++ : ++else ++ rm -rf conftest* ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. ++cat > conftest.$ac_ext < ++EOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ egrep "free" >/dev/null 2>&1; then ++ : ++else ++ rm -rf conftest* ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. ++if test "$cross_compiling" = yes; then ++ : ++else ++cat > conftest.$ac_ext < ++#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') ++#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) ++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) ++int main () { int i; for (i = 0; i < 256; i++) ++if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); ++exit (0); } ++ ++EOF ++{ (eval echo configure:1016: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ : ++else ++ ac_cv_header_stdc=no ++fi ++fi ++rm -fr conftest* ++fi ++fi ++ ++echo "$ac_t""$ac_cv_header_stdc" 1>&6 ++if test $ac_cv_header_stdc = yes; then ++ cat >> confdefs.h <<\EOF ++#define STDC_HEADERS 1 ++EOF ++ ++fi ++ ++for ac_hdr in memory.h unistd.h string.h ++do ++ac_safe=`echo "$ac_hdr" | tr './\055' '___'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` ++ cat >> confdefs.h <&6 ++fi ++done ++ ++ac_header_dirent=no ++for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h ++do ++ac_safe=`echo "$ac_hdr" | tr './\055' '___'` ++echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++#include <$ac_hdr> ++int main() { return 0; } ++int t() { ++DIR *dirp = 0; ++; return 0; } ++EOF ++if { (eval echo configure:1090: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_header_dirent_$ac_safe=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_header_dirent_$ac_safe=no" ++fi ++rm -f conftest* ++ ++fi ++if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdedfghijklmnopqrstuvwxyz./\055' 'ABCDEDFGHIJKLMNOPQRSTUVWXYZ___'` ++ cat >> confdefs.h <&6 ++fi ++done ++# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. ++if test $ac_header_dirent = dirent.h; then ++echo $ac_n "checking for -ldir""... $ac_c" 1>&6 ++ac_lib_var=`echo dir | tr '.-/+' '___p'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-ldir $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ LIBS="$LIBS -ldir" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++else ++echo $ac_n "checking for -lx""... $ac_c" 1>&6 ++ac_lib_var=`echo x | tr '.-/+' '___p'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lx $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ LIBS="$LIBS -lx" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++fi ++ ++echo $ac_n "checking whether closedir returns void""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_func_closedir_void'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_func_closedir_void=yes ++else ++cat > conftest.$ac_ext < ++#include <$ac_header_dirent> ++int closedir(); main() { exit(closedir(opendir(".")) != 0); } ++EOF ++{ (eval echo configure:1198: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_func_closedir_void=no ++else ++ ac_cv_func_closedir_void=yes ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_func_closedir_void" 1>&6 ++if test $ac_cv_func_closedir_void = yes; then ++ cat >> confdefs.h <<\EOF ++#define CLOSEDIR_VOID 1 ++EOF ++ ++fi ++ ++# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works ++# for constant arguments. Useless! ++echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++int main() { return 0; } ++int t() { ++char *p = alloca(2 * sizeof(int)); ++; return 0; } ++EOF ++if { (eval echo configure:1231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_header_alloca_h=yes ++else ++ rm -rf conftest* ++ ac_cv_header_alloca_h=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 ++if test $ac_cv_header_alloca_h = yes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_ALLOCA_H 1 ++EOF ++ ++fi ++ ++echo $ac_n "checking for alloca""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_func_alloca'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++# else ++# ifdef _AIX ++ #pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char *alloca (); ++# endif ++# endif ++# endif ++#endif ++ ++int main() { return 0; } ++int t() { ++char *p = (char *) alloca(1); ++; return 0; } ++EOF ++if { (eval echo configure:1279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_func_alloca=yes ++else ++ rm -rf conftest* ++ ac_cv_func_alloca=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_func_alloca" 1>&6 ++if test $ac_cv_func_alloca = yes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_ALLOCA 1 ++EOF ++ ++fi ++ ++if test $ac_cv_func_alloca = no; then ++ # The SVR3 libPW and SVR4 libucb both contain incompatible functions ++ # that cause trouble. Some versions do not even contain alloca or ++ # contain a buggy version. If you still want to use their alloca, ++ # use ar to extract alloca.o from them instead of compiling alloca.c. ++ ALLOCA=alloca.o ++ cat >> confdefs.h <<\EOF ++#define C_ALLOCA 1 ++EOF ++ ++ ++echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <&5 | ++ egrep "webecray" >/dev/null 2>&1; then ++ rm -rf conftest* ++ ac_cv_os_cray=yes ++else ++ rm -rf conftest* ++ ac_cv_os_cray=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_os_cray" 1>&6 ++if test $ac_cv_os_cray = yes; then ++for ac_func in _getb67 GETB67 getb67; do ++ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++char $ac_func(); ++ ++int main() { return 0; } ++int t() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:1365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++ ++fi ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ cat >> confdefs.h <&6 ++fi ++ ++done ++fi ++ ++echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_c_stack_direction=0 ++else ++cat > conftest.$ac_ext < addr) ? 1 : -1; ++} ++main () ++{ ++ exit (find_stack_direction() < 0); ++} ++EOF ++{ (eval echo configure:1416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_c_stack_direction=1 ++else ++ ac_cv_c_stack_direction=-1 ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 ++cat >> confdefs.h <&6 ++if eval "test \"`echo '$''{'ac_cv_func_strcoll'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_func_strcoll=no ++else ++cat > conftest.$ac_ext < ++main () ++{ ++ exit (strcoll ("abc", "def") >= 0 || ++ strcoll ("ABC", "DEF") >= 0 || ++ strcoll ("123", "456") >= 0); ++} ++EOF ++{ (eval echo configure:1451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_func_strcoll=yes ++else ++ ac_cv_func_strcoll=no ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_func_strcoll" 1>&6 ++if test $ac_cv_func_strcoll = yes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_STRCOLL 1 ++EOF ++ ++fi ++ ++trap '' 1 2 15 ++cat > confcache <<\EOF ++# This file is a shell script that caches the results of configure ++# tests run on this system so they can be shared between configure ++# scripts and configure runs. It is not useful on other systems. ++# If it contains results you don't want to keep, you may remove or edit it. ++# ++# By default, configure uses ./config.cache as the cache file, ++# creating it if it does not exist already. You can give configure ++# the --cache-file=FILE option to use a different cache file; that is ++# what configure does when it calls configure scripts in ++# subdirectories, so they share the cache. ++# Giving --cache-file=/dev/null disables caching, for debugging configure. ++# config.status only pays attention to the cache file if you give it the ++# --recheck option to rerun configure. ++# ++EOF ++# Ultrix sh set writes to stderr and can't be redirected directly, ++# and sets the high bit in the cache file unless we assign to the vars. ++(set) 2>&1 | ++ sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ ++ >> confcache ++if cmp -s $cache_file confcache; then ++ : ++else ++ if test -w $cache_file; then ++ echo "updating cache $cache_file" ++ cat confcache > $cache_file ++ else ++ echo "not updating unwritable cache $cache_file" ++ fi ++fi ++rm -f confcache ++ ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++test "x$prefix" = xNONE && prefix=$ac_default_prefix ++# Let make expand exec_prefix. ++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ++# Any assignment to VPATH causes Sun make to only execute ++# the first set of double-colon rules, so remove it if not needed. ++# If there is a colon in the path, we need to keep it. ++if test "x$srcdir" = x.; then ++ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' ++fi ++ ++trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 ++ ++# Transform confdefs.h into DEFS. ++# Protect against shell expansion while executing Makefile rules. ++# Protect against Makefile macro expansion. ++cat > conftest.defs <<\EOF ++s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g ++s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g ++s%\[%\\&%g ++s%\]%\\&%g ++s%\$%$$%g ++EOF ++DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` ++rm -f conftest.defs ++ ++ ++# Without the "./", some shells look in PATH for config.status. ++: ${CONFIG_STATUS=./config.status} ++ ++echo creating $CONFIG_STATUS ++rm -f $CONFIG_STATUS ++cat > $CONFIG_STATUS </dev/null | sed 1q`: ++# ++# $0 $ac_configure_args ++# ++# Compiler output produced by configure, useful for debugging ++# configure, is in ./config.log if it exists. ++ ++ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" ++for ac_option ++do ++ case "\$ac_option" in ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" ++ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; ++ -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ++ echo "$CONFIG_STATUS generated by autoconf version 2.7" ++ exit 0 ;; ++ -help | --help | --hel | --he | --h) ++ echo "\$ac_cs_usage"; exit 0 ;; ++ *) echo "\$ac_cs_usage"; exit 1 ;; ++ esac ++done ++ ++ac_given_srcdir=$srcdir ++ ++trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 ++EOF ++cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF ++$ac_vpsub ++$extrasub ++s%@CFLAGS@%$CFLAGS%g ++s%@CPPFLAGS@%$CPPFLAGS%g ++s%@CXXFLAGS@%$CXXFLAGS%g ++s%@DEFS@%$DEFS%g ++s%@LDFLAGS@%$LDFLAGS%g ++s%@LIBS@%$LIBS%g ++s%@exec_prefix@%$exec_prefix%g ++s%@prefix@%$prefix%g ++s%@program_transform_name@%$program_transform_name%g ++s%@bindir@%$bindir%g ++s%@sbindir@%$sbindir%g ++s%@libexecdir@%$libexecdir%g ++s%@datadir@%$datadir%g ++s%@sysconfdir@%$sysconfdir%g ++s%@sharedstatedir@%$sharedstatedir%g ++s%@localstatedir@%$localstatedir%g ++s%@libdir@%$libdir%g ++s%@includedir@%$includedir%g ++s%@oldincludedir@%$oldincludedir%g ++s%@infodir@%$infodir%g ++s%@mandir@%$mandir%g ++s%@CC@%$CC%g ++s%@AR@%$AR%g ++s%@RANLIB@%$RANLIB%g ++s%@CPP@%$CPP%g ++s%@ALLOCA@%$ALLOCA%g ++ ++CEOF ++EOF ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ++ # Support "outfile[:infile]", defaulting infile="outfile.in". ++ case "$ac_file" in ++ *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ++ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; ++ *) ac_file_in="${ac_file}.in" ;; ++ esac ++ ++ # Adjust relative srcdir, etc. for subdirectories. ++ ++ # Remove last slash and all that follows it. Not all systems have dirname. ++ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` ++ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then ++ # The file is in a subdirectory. ++ test ! -d "$ac_dir" && mkdir "$ac_dir" ++ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" ++ # A "../" for each directory in $ac_dir_suffix. ++ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` ++ else ++ ac_dir_suffix= ac_dots= ++ fi ++ ++ case "$ac_given_srcdir" in ++ .) srcdir=. ++ if test -z "$ac_dots"; then top_srcdir=. ++ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; ++ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; ++ *) # Relative path. ++ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" ++ top_srcdir="$ac_dots$ac_given_srcdir" ;; ++ esac ++ ++ echo creating "$ac_file" ++ rm -f "$ac_file" ++ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." ++ case "$ac_file" in ++ *Makefile*) ac_comsub="1i\\ ++# $configure_input" ;; ++ *) ac_comsub= ;; ++ esac ++ sed -e "$ac_comsub ++s%@configure_input@%$configure_input%g ++s%@srcdir@%$srcdir%g ++s%@top_srcdir@%$top_srcdir%g ++" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file ++fi; done ++rm -f conftest.subs ++ ++ ++ ++exit 0 ++EOF ++chmod +x $CONFIG_STATUS ++rm -fr confdefs* $ac_clean_files ++test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ++ +diff -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 ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++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 ++ ++ * Makefile (install-real): New target. ++ (install-locales-real): New. ++ (install-locales): New. ++ (install): Use install-locales. ++ ++2000-01-03 Cristian Gafton ++ ++ * 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 ++# 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 ++- 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 ++- add the c_stubs add-on ++- sparc patch from davem ++ ++* Thu Feb 24 2000 Cristian Gafton ++- fix locale problems on 64 bit arches ++ ++* Tue Feb 22 2000 Cristian Gafton ++- cygnus sync up for fixes to nscd ++ ++* Thu Feb 17 2000 Cristian Gafton ++- updated to include new China timezones ++- sync up with the locale changes from Cygnus ++ ++* Tue Feb 01 2000 Cristian Gafton ++- 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 ++- update from cygnus branch ++- compress man pages for the linuxthreads stuff ++ ++* Fri Jan 21 2000 Cristian Gafton ++- add Jakub's patch so we back out even more ++ ++* Thu Jan 20 2000 Cristian Gafton ++- back out the setrlimit changes (well, sort of) ++ ++* Mon Jan 03 2000 Cristian Gafton ++- 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 +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 ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 ++ ++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 ++#include ++ ++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 ++#include ++#include ++ ++/* 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 +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 ++ ++#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 ++ ++#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 ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef ESIZE ++typedef double tocheck_t; ++#define ESIZE 11 ++#define MSIZE 52 ++#define FUNC(x) x ++#endif ++ ++#define R_NEAREST 1 ++#define R_ZERO 2 ++#define R_UP 4 ++#define R_DOWN 8 ++#define R_ALL (R_NEAREST|R_ZERO|R_UP|R_DOWN) ++static fenv_t rmodes[4]; ++static const char * const rmnames[4] = ++{ "nearest","zero","+Inf","-Inf" }; ++ ++typedef union { ++ tocheck_t tc; ++ unsigned char c[sizeof(tocheck_t)]; ++} union_t; ++ ++/* Don't try reading these in a font that doesn't distinguish ++ O and zero. */ ++typedef enum { ++ P_Z = 0x0, /* 00000...0 */ ++ P_000O = 0x1, /* 00011...1 */ ++ P_001Z = 0x2, /* 00100...0 */ ++ P_00O = 0x3, /* 00111...1 */ ++ P_01Z = 0x4, /* 01000...0 */ ++ P_010O = 0x5, /* 01011...1 */ ++ P_011Z = 0x6, /* 01100...0 */ ++ P_0O = 0x7, /* 01111...1 */ ++ P_1Z = 0x8, /* 10000...0 */ ++ P_100O = 0x9, /* 10011...1 */ ++ P_101Z = 0xa, /* 10100...0 */ ++ P_10O = 0xb, /* 10111...1 */ ++ P_11Z = 0xc, /* 11000...0 */ ++ P_110O = 0xd, /* 11011...1 */ ++ P_111Z = 0xe, /* 11100...0 */ ++ P_O = 0xf, /* 11111...1 */ ++ P_Z1 = 0x11, /* 000...001 */ ++ P_Z10 = 0x12, /* 000...010 */ ++ P_Z11 = 0x13, /* 000...011 */ ++ P_0O00 = 0x14, /* 011...100 */ ++ P_0O01 = 0x15, /* 011...101 */ ++ P_0O0 = 0x16, /* 011...110 */ ++ P_1Z1 = 0x19, /* 100...001 */ ++ P_1Z10 = 0x1a, /* 100...010 */ ++ P_1Z11 = 0x1b, /* 100...011 */ ++ P_O00 = 0x1c, /* 111...100 */ ++ P_O01 = 0x1d, /* 111...101 */ ++ P_O0 = 0x1e, /* 111...110 */ ++ P_R = 0x20, /* rrr...rrr */ /* ('r' means random. ) */ ++ P_Ro = 0x21, /* rrr...rrr, with odd parity. */ ++ P_0R = 0x22, /* 0rr...rrr */ ++ P_1R = 0x23, /* 1rr...rrr */ ++ P_Rno = 0x24, /* rrr...rrr, but not all ones. */ ++} pattern_t; ++ ++static void ++pattern_fill(pattern_t ptn, unsigned char *start, int bitoffset, int count) ++{ ++#define bitset(count, value) \ ++ start[(count)/8] = (start[(count)/8] & ~(1 << 7-(count)%8) \ ++ | (value) << 7-(count)%8) ++ int i; ++ ++ if (ptn >= 0 && ptn <= 0xf) ++ { ++ /* Patterns between 0 and 0xF have the following format: ++ The LSBit is used to fill the last n-3 bits of the pattern; ++ The next 3 bits are the first 3 bits of the pattern. */ ++ for (i = 0; i < count; i++) ++ if (i < 3) ++ bitset((bitoffset+i), ptn >> (3-i) & 1); ++ else ++ bitset((bitoffset+i), ptn >> 0 & 1); ++ } ++ else if (ptn <= 0x1f) ++ { ++ /* Patterns between 0x10 and 0x1F have the following format: ++ The two LSBits are the last two bits of the pattern; ++ The 0x8 bit is the first bit of the pattern; ++ The 0x4 bit is used to fill the remainder. */ ++ for (i = 0; i < count; i++) ++ if (i == 0) ++ bitset((bitoffset+i), ptn >> 3 & 1); ++ else if (i >= count-2) ++ bitset((bitoffset+i), ptn >> (count-1-i) & 1); ++ else ++ bitset((bitoffset+i), ptn >> 2 & 1); ++ } ++ else switch (ptn) ++ { ++ case P_0R: case P_1R: ++ assert(count > 0); ++ bitset(bitoffset, ptn & 1); ++ count--; ++ bitoffset++; ++ case P_R: ++ for (; count > 0; count--, bitoffset++) ++ bitset(bitoffset, rand() & 1); ++ break; ++ case P_Ro: ++ { ++ int op = 1; ++ assert(count > 0); ++ for (; count > 1; count--, bitoffset++) ++ bitset(bitoffset, op ^= (rand() & 1)); ++ bitset(bitoffset, op); ++ break; ++ } ++ case P_Rno: ++ { ++ int op = 1; ++ assert(count > 0); ++ for (; count > 1; count--, bitoffset++) ++ { ++ int r = rand() & 1; ++ op &= r; ++ bitset(bitoffset, r); ++ } ++ bitset(bitoffset, rand() & (op ^ 1)); ++ break; ++ } ++ ++ default: ++ assert(0); ++ } ++#undef bitset ++} ++ ++static tocheck_t ++pattern(int negative, pattern_t exp, pattern_t mant) ++{ ++ union_t result; ++#if 0 ++ int i; ++#endif ++ ++ pattern_fill(negative ? P_O : P_Z, result.c, 0, 1); ++ pattern_fill(exp, result.c, 1, ESIZE); ++ pattern_fill(mant, result.c, ESIZE+1, MSIZE); ++#if 0 ++ printf("neg=%d exp=%02x mant=%02x: ", negative, exp, mant); ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", result.c[i]); ++ printf("\n"); ++#endif ++ return result.tc; ++} ++ ++/* Return the closest different tocheck_t to 'x' in the direction of ++ 'direction', or 'x' if there is no such value. Assumes 'x' is not ++ a NaN. */ ++static tocheck_t ++delta(tocheck_t x, int direction) ++{ ++ union_t xx; ++ int i; ++ ++ xx.tc = x; ++ if (xx.c[0] & 0x80) ++ direction = -direction; ++ if (direction == +1) ++ { ++ union_t tx; ++ tx.tc = pattern(xx.c[0] >> 7, P_O, P_Z); ++ if (memcmp(tx.c, xx.c, sizeof(tocheck_t)) == 0) ++ return x; ++ } ++ for (i = sizeof(tocheck_t)-1; i > 0; i--) ++ { ++ xx.c[i] += direction; ++ if (xx.c[i] != (direction > 0 ? 0 : 0xff)) ++ return xx.tc; ++ } ++ if (direction < 0 && (xx.c[0] & 0x7f) == 0) ++ return pattern(~(xx.c[0] >> 7) & 1, P_Z, P_Z1); ++ else ++ { ++ xx.c[0] += direction; ++ return xx.tc; ++ } ++} ++ ++static int nerrors = 0; ++ ++#ifdef FE_ALL_INVALID ++static const int all_exceptions = FE_ALL_INVALID | FE_ALL_EXCEPT; ++#else ++static const int all_exceptions = FE_ALL_EXCEPT; ++#endif ++ ++static void ++check_result(int line, const char *rm, tocheck_t expected, tocheck_t actual) ++{ ++ if (memcmp(&expected, &actual, sizeof(tocheck_t)) != 0) ++ { ++ unsigned char *ex, *ac; ++ size_t i; ++ ++ printf("%s:%d:round %s:result failed\n" ++ " expected result 0x", __FILE__, line, rm); ++ ex = (unsigned char *)&expected; ++ ac = (unsigned char *)&actual; ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", ex[i]); ++ printf(" got 0x"); ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", ac[i]); ++ printf("\n"); ++ nerrors++; ++ } ++} ++ ++static const struct { ++ int except; ++ const char *name; ++} excepts[] = { ++#define except_entry(ex) { ex, #ex } , ++#ifdef FE_INEXACT ++ except_entry(FE_INEXACT) ++#else ++# define FE_INEXACT 0 ++#endif ++#ifdef FE_DIVBYZERO ++ except_entry(FE_DIVBYZERO) ++#else ++# define FE_DIVBYZERO 0 ++#endif ++#ifdef FE_UNDERFLOW ++ except_entry(FE_UNDERFLOW) ++#else ++# define FE_UNDERFLOW 0 ++#endif ++#ifdef FE_OVERFLOW ++ except_entry(FE_OVERFLOW) ++#else ++# define FE_OVERFLOW 0 ++#endif ++#ifdef FE_INVALID ++ except_entry(FE_INVALID) ++#else ++# define FE_INVALID 0 ++#endif ++#ifdef FE_INVALID_SNAN ++ except_entry(FE_INVALID_SNAN) ++#else ++# define FE_INVALID_SNAN FE_INVALID ++#endif ++#ifdef FE_INVALID_ISI ++ except_entry(FE_INVALID_ISI) ++#else ++# define FE_INVALID_ISI FE_INVALID ++#endif ++#ifdef FE_INVALID_IDI ++ except_entry(FE_INVALID_IDI) ++#else ++# define FE_INVALID_IDI FE_INVALID ++#endif ++#ifdef FE_INVALID_ZDZ ++ except_entry(FE_INVALID_ZDZ) ++#else ++# define FE_INVALID_ZDZ FE_INVALID ++#endif ++#ifdef FE_INVALID_COMPARE ++ except_entry(FE_INVALID_COMPARE) ++#else ++# define FE_INVALID_COMPARE FE_INVALID ++#endif ++#ifdef FE_INVALID_SOFTWARE ++ except_entry(FE_INVALID_SOFTWARE) ++#else ++# define FE_INVALID_SOFTWARE FE_INVALID ++#endif ++#ifdef FE_INVALID_SQRT ++ except_entry(FE_INVALID_SQRT) ++#else ++# define FE_INVALID_SQRT FE_INVALID ++#endif ++#ifdef FE_INVALID_INTEGER_CONVERSION ++ except_entry(FE_INVALID_INTEGER_CONVERSION) ++#else ++# define FE_INVALID_INTEGER_CONVERSION FE_INVALID ++#endif ++}; ++ ++static int excepts_missing = 0; ++ ++static void ++check_excepts(int line, const char *rm, int expected, int actual) ++{ ++ if (expected & excepts_missing) ++ expected = expected & ~excepts_missing | FE_INVALID_SNAN; ++ if ((expected & all_exceptions) != actual) ++ { ++ size_t i; ++ printf("%s:%d:round %s:exceptions failed\n" ++ " expected exceptions ", __FILE__, line,rm); ++ for (i = 0; i < sizeof(excepts)/sizeof(excepts[0]); i++) ++ if (expected & excepts[i].except) ++ printf("%s ",excepts[i].name); ++ if ((expected & all_exceptions) == 0) ++ printf("- "); ++ printf("got"); ++ for (i = 0; i < sizeof(excepts)/sizeof(excepts[0]); i++) ++ if (actual & excepts[i].except) ++ printf(" %s",excepts[i].name); ++ if ((actual & all_exceptions) == 0) ++ printf("- "); ++ printf(".\n"); ++ nerrors++; ++ } ++} ++ ++typedef enum { ++ B_ADD, B_SUB, B_MUL, B_DIV, B_NEG, B_ABS, B_SQRT ++} op_t; ++typedef struct { ++ int line; ++ op_t op; ++ int a_sgn; ++ pattern_t a_exp, a_mant; ++ int b_sgn; ++ pattern_t b_exp, b_mant; ++ int rmode; ++ int excepts; ++ int x_sgn; ++ pattern_t x_exp, x_mant; ++} optest_t; ++static const optest_t optests[] = { ++ /* Additions of zero. */ ++ {__LINE__,B_ADD, 0,P_Z,P_Z, 0,P_Z,P_Z, R_ALL,0, 0,P_Z,P_Z }, ++ {__LINE__,B_ADD, 1,P_Z,P_Z, 0,P_Z,P_Z, R_ALL & ~R_DOWN,0, 0,P_Z,P_Z }, ++ {__LINE__,B_ADD, 1,P_Z,P_Z, 0,P_Z,P_Z, R_DOWN,0, 1,P_Z,P_Z }, ++ {__LINE__,B_ADD, 1,P_Z,P_Z, 1,P_Z,P_Z, R_ALL,0, 1,P_Z,P_Z }, ++ ++ /* Additions with NaN. */ ++ {__LINE__,B_ADD, 0,P_O,P_101Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_101Z }, ++ {__LINE__,B_ADD, 0,P_O,P_01Z, 0,P_Z,P_Z, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_11Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_O,P_0O, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_O }, ++ {__LINE__,B_ADD, 0,P_Z,P_Z, 0,P_O,P_11Z, R_ALL,0, 0,P_O,P_11Z }, ++ {__LINE__,B_ADD, 0,P_O,P_001Z, 0,P_O,P_001Z, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_101Z }, ++ {__LINE__,B_ADD, 0,P_O,P_1Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_1Z }, ++ {__LINE__,B_ADD, 0,P_0O,P_Z, 0,P_O,P_10O, R_ALL,0, 0,P_O,P_10O }, ++ ++ /* Additions with infinity. */ ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_Z,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_Z,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_Z,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_O,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_O,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_O,P_Z, R_ALL, ++ FE_INVALID | FE_INVALID_ISI, 0,P_O,P_1Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_O,P_Z, R_ALL, ++ FE_INVALID | FE_INVALID_ISI, 0,P_O,P_1Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_0O,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_0O,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_0O,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_0O,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ ++ /* Overflow (and zero). */ ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 0,P_O0,P_Z, R_NEAREST | R_UP, ++ FE_INEXACT | FE_OVERFLOW, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 0,P_O0,P_Z, R_ZERO | R_DOWN, ++ FE_INEXACT | FE_OVERFLOW, 0,P_O0,P_O }, ++ {__LINE__,B_ADD, 1,P_O0,P_Z, 1,P_O0,P_Z, R_NEAREST | R_DOWN, ++ FE_INEXACT | FE_OVERFLOW, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O0,P_Z, 1,P_O0,P_Z, R_ZERO | R_UP, ++ FE_INEXACT | FE_OVERFLOW, 1,P_O0,P_O }, ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 1,P_O0,P_Z, R_ALL & ~R_DOWN, ++ 0, 0,P_Z,P_Z }, ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 1,P_O0,P_Z, R_DOWN, ++ 0, 1,P_Z,P_Z }, ++ ++ /* Negation. */ ++ {__LINE__,B_NEG, 0,P_Z,P_Z, 0,0,0, R_ALL, 0, 1,P_Z,P_Z }, ++ {__LINE__,B_NEG, 1,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_NEG, 0,P_O,P_Z, 0,0,0, R_ALL, 0, 1,P_O,P_Z }, ++ {__LINE__,B_NEG, 1,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_NEG, 0,P_O,P_1Z, 0,0,0, R_ALL, 0, 1,P_O,P_1Z }, ++ {__LINE__,B_NEG, 1,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_NEG, 0,P_O,P_01Z, 0,0,0, R_ALL, 0, 1,P_O,P_01Z }, ++ {__LINE__,B_NEG, 1,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z }, ++ {__LINE__,B_NEG, 0,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 1,P_1Z,P_1Z1 }, ++ {__LINE__,B_NEG, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 }, ++ {__LINE__,B_NEG, 0,P_Z,P_Z1, 0,0,0, R_ALL, 0, 1,P_Z,P_Z1 }, ++ {__LINE__,B_NEG, 1,P_Z,P_Z1, 0,0,0, R_ALL, 0, 0,P_Z,P_Z1 }, ++ ++ /* Absolute value. */ ++ {__LINE__,B_ABS, 0,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_ABS, 1,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_ABS, 0,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_ABS, 1,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_ABS, 0,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_ABS, 1,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_ABS, 0,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z }, ++ {__LINE__,B_ABS, 1,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z }, ++ {__LINE__,B_ABS, 0,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 }, ++ {__LINE__,B_ABS, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 }, ++ {__LINE__,B_ABS, 0,P_Z,P_Z1, 0,0,0, R_ALL, 0, 0,P_Z,P_Z1 }, ++ {__LINE__,B_ABS, 1,P_Z,P_Z1, 0,0,0, R_ALL, 0, 0,P_Z,P_Z1 }, ++ ++ /* Square root. */ ++ {__LINE__,B_SQRT, 0,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_SQRT, 1,P_Z,P_Z, 0,0,0, R_ALL, 0, 1,P_Z,P_Z }, ++ {__LINE__,B_SQRT, 0,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 1,P_O,P_1Z, 0,0,0, R_ALL, 0, 1,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 0,P_O,P_01Z, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_11Z }, ++ {__LINE__,B_SQRT, 1,P_O,P_01Z, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 1,P_O,P_11Z }, ++ ++ {__LINE__,B_SQRT, 0,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_SQRT, 0,P_0O,P_Z, 0,0,0, R_ALL, 0, 0,P_0O,P_Z }, ++ ++ {__LINE__,B_SQRT, 1,P_O,P_Z, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 1,P_Z,P_Z1, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z }, ++ ++}; ++ ++static void ++check_op(void) ++{ ++ size_t i; ++ int j; ++ tocheck_t r, a, b, x; ++ int raised; ++ ++ for (i = 0; i < sizeof(optests)/sizeof(optests[0]); i++) ++ { ++ a = pattern(optests[i].a_sgn, optests[i].a_exp, ++ optests[i].a_mant); ++ b = pattern(optests[i].b_sgn, optests[i].b_exp, ++ optests[i].b_mant); ++ x = pattern(optests[i].x_sgn, optests[i].x_exp, ++ optests[i].x_mant); ++ for (j = 0; j < 4; j++) ++ if (optests[i].rmode & 1<= fabs(x1) && fabs(x1) <= fabs(x2); ++ break; ++ case R_ZERO: case R_DOWN: ++ x2 = r2 * r2 - a; ++ ok = x1 <= 0 && x2 >= 0; ++ break; ++ case R_UP: ++ x0 = r0 * r0 - a; ++ ok = x1 >= 0 && x0 <= 0; ++ break; ++ default: ++ assert(0); ++ } ++ } ++ else ++ ok = x1 == 0; ++ if (!ok) ++ fail_xr(__LINE__,rmnames[j],a,r1,x1,excepts&FE_INEXACT); ++ } ++ check_excepts(__LINE__,"all",0,raised); ++} ++ ++int main(int argc, char **argv) ++{ ++ int i; ++ ++ _LIB_VERSION = _IEEE_; ++ ++ /* Set up environments for rounding modes. */ ++ fesetenv(FE_DFL_ENV); ++ fesetround(FE_TONEAREST); ++ fegetenv(rmodes+0); ++ fesetround(FE_TOWARDZERO); ++ fegetenv(rmodes+1); ++ fesetround(FE_UPWARD); ++ fegetenv(rmodes+2); ++ fesetround(FE_DOWNWARD); ++ fegetenv(rmodes+3); ++ ++#if defined(FE_INVALID_SOFTWARE) || defined(FE_INVALID_SQRT) ++ /* There's this really stupid feature of the 601... */ ++ fesetenv(FE_DFL_ENV); ++ feraiseexcept(FE_INVALID_SOFTWARE); ++ if (!fetestexcept(FE_INVALID_SOFTWARE)) ++ excepts_missing |= FE_INVALID_SOFTWARE; ++ fesetenv(FE_DFL_ENV); ++ feraiseexcept(FE_INVALID_SQRT); ++ if (!fetestexcept(FE_INVALID_SQRT)) ++ excepts_missing |= FE_INVALID_SQRT; ++#endif ++ ++ check_op(); ++ for (i = 0; i < 100000; i++) ++ check_sqrt(pattern(0, P_Rno, P_R)); ++ for (i = 0; i < 100; i++) ++ check_sqrt(pattern(0, P_Z, P_R)); ++ check_sqrt(pattern(0,P_Z,P_Z1)); ++ ++ printf("%d errors.\n", nerrors); ++ return nerrors == 0 ? 0 : 1; ++} +diff -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 ++ ++/* 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 ++#include ++#include ++#include ++#include ++ ++ ++/* 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 directly; include instead." +-#endif +- +-#include +- +-/* 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 /* 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 and ++ Jakub Jelinek ++ ++ 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 +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 ++#include ++#include ++#include ++#include ++ ++/* 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 ++#include ++#include ++#include ++ ++ ++/* 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 0000000..5bef1fd --- /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 + + * 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 0000000..7466ac2 --- /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 + + * 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 + + * 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 , 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 0000000..bc3289c --- /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 , 1996. + +@@ -18,6 +18,7 @@ + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + ++#include + #include + #include + #include +@@ -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 0000000..06df633 --- /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 + + * 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 0000000..4b72e08 --- /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 + + * 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 0000000..037758c --- /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 + + * 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 + + * sysdeps/unix/sysv/linux/alpha/ioperm.c (platform): Add entry for + Nautilus. Patch by Soohoon Lee . + +--- 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 0000000..cdd4c0b --- /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 + + * 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 . + +--- 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 0000000..dd12af8 --- /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 + + * 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 + + * 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 0000000..7f0784f --- /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 /* 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 + #include + #include ++#include + + #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 0000000..5459365 --- /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 0000000..3efac03 --- /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 0000000..bada1fc --- /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 0000000..af0b4b1 --- /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 ++ ++/* 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 ++#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 0000000..50564da --- /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 \n" + "Language-Team: Slovak \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: must be greater than \n" + msgstr "%s: musí by» väè¹ie ako \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 " character must not be in class `%s'" + msgstr " 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 " character not in class `%s'" + msgstr " 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 .\n" + msgstr "Chyby hláste na adrese - 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 not defined in character map" + msgstr "znak 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 or value given" + msgstr "nezadaná alebo 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 of range is smaller than from-value " ++msgstr "to-value rozsahu je men¹ia ako from-value " ++ ++#: 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 must be greater than the value of " +-msgstr "hodnota musí by» väè¹ia ako hodnota " ++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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..db70efb --- /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 + + * 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 0000000..b1269e0 --- /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 +Organization: Siemens AG +To: Jeffrey Bedard , 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 0000000..ce88879 --- /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 0000000..efd6b2a --- /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 0000000..b946165 --- /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 0000000..1a9d407 --- /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 0000000..b119b92 --- /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 0000000..a14e1d4 --- /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 0000000..eae6fec --- /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 0000000..1a48c00 --- /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 * 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 0000000..89cc9ea --- /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, , 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 0000000..c4bd19c --- /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 0000000..761771f --- /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 0000000..eefc6fa --- /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 0000000..70245a6 --- /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 0000000..28aa2e1 --- /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 0000000..f64d673 --- /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 0000000..594569b --- /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 0000000..ac4eb5b --- /dev/null +++ b/patches/glibc/2.2.3/errlist-arm.patch @@ -0,0 +1,48 @@ +Subject: patch for arm +From: Philip Blundell +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 + + * 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 0000000..1773002 --- /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 0000000..66fee29 --- /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 + + * 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 0000000..c694525 --- /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 0000000..d131f1b --- /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 0000000..06376b5 --- /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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..42c67d2 --- /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 +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 + + * 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 0000000..158eb39 --- /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 +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 + + * 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 0000000..50e5bc5 --- /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 0000000..176983b --- /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 0000000..2e9ee04 --- /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 0000000..ac046e4 --- /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 0000000..ccdb6d3 --- /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 0000000..3bd7fc6 --- /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 0000000..ac4eb5b --- /dev/null +++ b/patches/glibc/2.2.5/errlist-arm.patch @@ -0,0 +1,48 @@ +Subject: patch for arm +From: Philip Blundell +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 + + * 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 0000000..2ee7174 --- /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 0000000..5d609f9 --- /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 + + * 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 0000000..31b7b67 --- /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 +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 0000000..effd636 --- /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 0000000..0428c87 --- /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 0000000..2a8c3a9 --- /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 0000000..54c349e --- /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 , 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 , 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 +@@ -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 +@@ -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 0000000..f13a892 --- /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 0000000..f7cfa58 --- /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 0000000..5019031 --- /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 + + +--- /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 + #include + +-/* 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 +--- /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 0000000..fa4b5b7 --- /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 0000000..2d9f092 --- /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 0000000..1b4f445 --- /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 +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 0000000..171d2e4 --- /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 0000000..fb1a0c9 --- /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 0000000..6b889c2 --- /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 0000000..4a07130 --- /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 +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: + +This fixes the uses of casts as lvalue in the sunrpc code. + +Andreas. + +2004-02-08 Andreas Schwab + + * 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 + + #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 0000000..89cc9ea --- /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, , 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 0000000..c4bd19c --- /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 0000000..c9f3701 --- /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 0000000..842d8f5 --- /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 0000000..f14998d --- /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 0000000..97740d5 --- /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 + #include + ++/* 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 directly; use 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 +- +-#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 +-#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 +-#include +- +-/* 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 +- +-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 +- +-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 ++#define _ASM ++#define _SETJMP_H ++#include ++#include ++#include ++ ++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 directly; use 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 ++ ++#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 ++#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 ++#include ++ ++/* 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 ++ ++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 ++ ++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 ++#define _ASM ++#define _SETJMP_H ++#include ++#include ++#include ++ ++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 + #include + ++/* 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 0000000..761771f --- /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 0000000..eefc6fa --- /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 0000000..a8267e6 --- /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 0000000..66fee29 --- /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 + + * 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 0000000..4276eee --- /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 0000000..129cffa --- /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 . + +@@ -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 0000000..ef174c2 --- /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 0000000..ea3e28c --- /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 +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 0000000..c070bd4 --- /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 + +=================================================================== +--- 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 0000000..2267f85 --- /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 0000000..4d811e9 --- /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 0000000..82984e5 --- /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 +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= +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: +List-Owner: +List-Help: +List-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 + + * 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 0000000..2308629 --- /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 + + +-/* 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 0000000..49c4e67 --- /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 0000000..a55a55a --- /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 +../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 0000000..d1e0eae --- /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 0000000..d11e9f8 --- /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: +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: +List-Archive: +List-Post: +List-Help: , +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 ; 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 ; 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 +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 + + * 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 0000000..3f86a5e --- /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 0000000..b0d346b --- /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 0000000..4ee33e2 --- /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 + + * 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 0000000..37f7b8d --- /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 0000000..da24282 --- /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 0000000..eca01c3 --- /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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..9e195ba --- /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 0000000..c73b36f --- /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 0000000..b810e96 --- /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 . + +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 + #include + + 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 0000000..6a40253 --- /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 "; ++ print "#include "; + print "#include "; + 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 0000000..5f1e8a4 --- /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 0000000..325c474 --- /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 0000000..c9f3701 --- /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 0000000..66fee29 --- /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 + + * 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 0000000..cdcd7ba --- /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 0000000..17f10da --- /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 + #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 <&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 0000000..fe97f67 --- /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 + + #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 + + #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 + + #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 + + #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 + + #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 0000000..1bd61e5 --- /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 0000000..3d6df5b --- /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 , 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 , 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 +@@ -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 +@@ -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 0000000..e2673de --- /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 0000000..5a68bc2 --- /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 +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: + +This fixes the uses of casts as lvalue in the sunrpc code. + +Andreas. + +2004-02-08 Andreas Schwab + + * 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 + + #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 0000000..4d811e9 --- /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 0000000..809c1b3 --- /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, , 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 0000000..03e5c5b --- /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 + * 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: +From: Krzysztof Halasa +Date: Thu, 10 Jun 2004 13:41:44 +0200 +Message-ID: +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 0000000..7eae11a --- /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 0000000..d28ab9e --- /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 + + * 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 0000000..2b46818 --- /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 0000000..bd70d4a --- /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: +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: +List-Archive: +List-Post: +List-Help: , +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 ; 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 ; 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 +Organization: GCC Team, Red Hat +Date: 12 Apr 2003 06:28:51 -0300 +Message-ID: +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 + + * 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 +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 , 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 directly; include 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 */ ++/* 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 ++/* #include */ ++/* 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 + + +-/* 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 0000000..2094429 --- /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 0000000..17c999d --- /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 0000000..02c72b1 --- /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 + + * 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 0000000..96e8fb3 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-pr139-fix.patch @@ -0,0 +1,104 @@ +2004-04-29 Jakub Jelinek + + * 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 . + +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 0000000..51de6c8 --- /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 0000000..f93bb6f --- /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 0000000..289f66e --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc32-sysdep.patch @@ -0,0 +1,46 @@ +Fixes the error + +: Assembler messages: +:2: Error: junk at end of line, first unrecognized character is `1' ... +: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 0000000..20cb799 --- /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 0000000..13e3381 --- /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 ++#include 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 0000000..9eefe57 --- /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 0000000..76cdfaa --- /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 +To: GNU C Library +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 +To: Daniel Jacobowitz +Cc: GNU C Library +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 0000000..3f568ae --- /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 0000000..0c824bc --- /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 + + * 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 :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 0000000..604c36d --- /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... + + +--- 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 &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 0000000..82984e5 --- /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 +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= +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: +List-Owner: +List-Help: +List-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 + + * 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 0000000..f20432e --- /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" +To: dank@kegel.com +Reply-To: "add" +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 +- +-#include +- +-__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 0000000..2308629 --- /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 + + +-/* 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 0000000..c639051 --- /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 0000000..e0bf46d --- /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 0000000..b18985a --- /dev/null +++ b/patches/glibc/2.3.2/sscanf.patch @@ -0,0 +1,80 @@ +2003-03-05 Roland McGrath + + * 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 0000000..1cf4846 --- /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 , 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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..fadee0e --- /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, , 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 0000000..5f1e8a4 --- /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 0000000..2d9f092 --- /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 0000000..cdcd7ba --- /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 0000000..1bd61e5 --- /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 0000000..3d6df5b --- /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 , 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 , 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 +@@ -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 +@@ -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 0000000..e2673de --- /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 0000000..5a68bc2 --- /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 +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: + +This fixes the uses of casts as lvalue in the sunrpc code. + +Andreas. + +2004-02-08 Andreas Schwab + + * 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 + + #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 0000000..4d811e9 --- /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 0000000..03e5c5b --- /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 + * 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: +From: Krzysztof Halasa +Date: Thu, 10 Jun 2004 13:41:44 +0200 +Message-ID: +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 0000000..96e8fb3 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-pr139-fix.patch @@ -0,0 +1,104 @@ +2004-04-29 Jakub Jelinek + + * 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 . + +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 0000000..289f66e --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-sparc32-sysdep.patch @@ -0,0 +1,46 @@ +Fixes the error + +: Assembler messages: +:2: Error: junk at end of line, first unrecognized character is `1' ... +: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 0000000..20cb799 --- /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 0000000..76cdfaa --- /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 +To: GNU C Library +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 +To: Daniel Jacobowitz +Cc: GNU C Library +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 0000000..3f568ae --- /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 0000000..3a235a4 --- /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 0000000..354bdee --- /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 + + * 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 + #include + #include +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 + + /* 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 , 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 0000000..d0ebb13 --- /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 0000000..1aa023b --- /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 0000000..98e9903 --- /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 +Subject: iconvdata: Get rid of lvalue casts +From: Andreas Jaeger +Date: Sun, 07 Mar 2004 08:29:47 +0100 +Message-ID: + +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 + + * 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 , 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 , 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 , 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 , 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 , 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 0000000..e0ceba6 --- /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 + #include + +-/* 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 0000000..a085822 --- /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 0000000..20f8825 --- /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 0000000..0c824bc --- /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 + + * 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 :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 0000000..c85aab9 --- /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 0000000..7baea61 --- /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, , 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 0000000..0ad9a71 --- /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 0000000..6ddc020 --- /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 +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 +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 + + #* 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 0000000..9f21744 --- /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 +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 + + * 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 ++#include ++#include ++#include ++ ++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 ++ ++#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 0000000..d75c4ba --- /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 0000000..f3ad0c6 --- /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 0000000..3bbe6ea --- /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 + #include +- +-#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 + + #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 0000000..949a203 --- /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 0000000..6844a9c --- /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 0000000..604c36d --- /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... + + +--- 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 &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 0000000..f20432e --- /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" +To: dank@kegel.com +Reply-To: "add" +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 +- +-#include +- +-__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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..23ebc82 --- /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 0000000..d5d0309 --- /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 + + [BZ #398] + * sysdeps/s390/s390-32/dl-machine.h: Include 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 + #include + #include ++#include + + /* 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 + #include + #include ++#include + + /* 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 0000000..f3ad0c6 --- /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 0000000..3bbe6ea --- /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 + #include +- +-#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 + + #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 0000000..42be8a3 --- /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 + #include + +-/* 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 0000000..d5d8293 --- /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 + + * 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 :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 0000000..949a203 --- /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 0000000..6844a9c --- /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 0000000..ac72f53 --- /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 0000000..c01faf8 --- /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 0000000..7e2fdc8 --- /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 + + * 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 0000000..ace71e2 --- /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 + + * 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 0000000..5637ce6 --- /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 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 0000000..604c36d --- /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... + + +--- 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 &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 0000000..f20432e --- /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" +To: dank@kegel.com +Reply-To: "add" +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 +- +-#include +- +-__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 0000000..3845722 --- /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 0000000..d1142a2 --- /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_, pointing at SYS__ if +-# it exists, but also define SYS__ 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 '; \ +- 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 +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_ into + # __NR_N64_, as well as to define __NR_ to + # __NR__, if __NR__ is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include ' > 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 +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_ into + # __NR_N64_, as well as to define __NR_ to + # __NR__, if __NR__ is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include ' > 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 +- +-/* 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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..d5d0309 --- /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 + + [BZ #398] + * sysdeps/s390/s390-32/dl-machine.h: Include 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 + #include + #include ++#include + + /* 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 + #include + #include ++#include + + /* 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 0000000..f3ad0c6 --- /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 0000000..3bbe6ea --- /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 + #include +- +-#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 + + #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 0000000..42be8a3 --- /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 + #include + +-/* 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 0000000..d5d8293 --- /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 + + * 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 :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 0000000..949a203 --- /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 0000000..6844a9c --- /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 0000000..c01faf8 --- /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 0000000..1df5955 --- /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 0000000..7e2fdc8 --- /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 + + * 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 0000000..ace71e2 --- /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 + + * 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 0000000..5637ce6 --- /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 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 0000000..8adea8b --- /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 +To: Dan Kegel +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 0000000..2ef3ae3 --- /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 0000000..dcc7c9b --- /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 +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 + + * 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 0000000..604c36d --- /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... + + +--- 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 &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 0000000..f20432e --- /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" +To: dank@kegel.com +Reply-To: "add" +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 +- +-#include +- +-__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 0000000..38873ec --- /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" +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 0000000..3845722 --- /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 0000000..d1142a2 --- /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_, pointing at SYS__ if +-# it exists, but also define SYS__ 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 '; \ +- 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 +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_ into + # __NR_N64_, as well as to define __NR_ to + # __NR__, if __NR__ is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include ' > 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 +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_ into + # __NR_N64_, as well as to define __NR_ to + # __NR__, if __NR__ is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include ' > 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 +- +-/* 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 0000000..413c685 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 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 0000000..d5d0309 --- /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 + + [BZ #398] + * sysdeps/s390/s390-32/dl-machine.h: Include 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 + #include + #include ++#include + + /* 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 + #include + #include ++#include + + /* 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 0000000..996359a --- /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 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 0000000..0e6776f --- /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 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 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 0000000..423a1c5 --- /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 +To: Dan Kegel +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 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 0000000..9af78d1 --- /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 + +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 + + * 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 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 0000000..1ccc1e1 --- /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 +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 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 0000000..ea885ea --- /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 +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 0000000..ec48544 --- /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 + #include +- +-#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 + + #ifndef VERSYMIDX + +Signed-off-by: Robert P. J. Day 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 0000000..5d9943a --- /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... + + +--- 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 &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 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 0000000..899fa2a --- /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 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 0000000..d45cdbc --- /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" +To: dank@kegel.com +Reply-To: "add" +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 +- +-#include +- +-__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 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 0000000..2fd72f8 --- /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" +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 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 0000000..1e69bb2 --- /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 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 0000000..d8810fc --- /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 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 0000000..a729541 --- /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 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 0000000..3422070 --- /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 + #include + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include ++#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 0000000..20cb799 --- /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 0000000..0ad9a71 --- /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 0000000..0e8c2a6 --- /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 0000000..604c36d --- /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... + + +--- 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 &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 0000000..f20432e --- /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" +To: dank@kegel.com +Reply-To: "add" +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 +- +-#include +- +-__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 0000000..6de9f7e --- /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 0000000..a16b4af --- /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 + + * 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 + + * 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 0000000..a5edd25 --- /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 0000000..b52f324 --- /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 0000000..6234797 --- /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 0000000..081bc29 --- /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 + + * 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 0000000..59f6060 --- /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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 0000000..7719e5e --- /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: +From: "Vince Chen" +To: + +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 0000000..dd97838 --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.2/threadparam.patch @@ -0,0 +1,69 @@ +2002-05-21 Ulrich Drepper + + * 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 0000000..0a6cee1 --- /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 ++ ++ * 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 + + * 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 0000000..fd34034 --- /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 0000000..48127a1 --- /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 0000000..22a1cfe --- /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 0000000..8c9cdb8 --- /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 0000000..dd97838 --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.5/threadparam.patch @@ -0,0 +1,69 @@ +2002-05-21 Ulrich Drepper + + * 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 0000000..e9532c7 --- /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 + +- .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 0000000..45373f8 --- /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 0000000..90ecc88 --- /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 0000000..3c4e3a1 --- /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 0000000..a382a0a --- /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 0000000..09ae007 --- /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 0000000..87877ee --- /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 0000000..239b290 --- /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 0000000..239b290 --- /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 0000000..46ee02c --- /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: +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: +List-Archive: +List-Post: +List-Help: , +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 +To: Ulrich Drepper , Roland McGrath +Cc: Glibc hackers +Subject: [PATCH] Fix build with GCC 4 +Message-ID: <20050305092049.GJ4777@sunsite.mff.cuni.cz> +Reply-To: Jakub Jelinek +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 + + * 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 0000000..0c0dac0 --- /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 0000000..0c0dac0 --- /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 0000000..239b290 --- /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 0000000..30e7f2a --- /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 0000000..640008c --- /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 0000000..4a900bc --- /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 + #include + #include ++#include + #include + #include +-#include + + 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 + #ifdef CONFIG_HIGHMEM + #include +-#include ++#include + #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 + #include + #include +-#include + #include + + #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 + #ifdef CONFIG_HIGHMEM + #include +-#include ++#include + #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 + #include +-#include + #include + + /* 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 + #include +-#include ++#include + #include + + /* 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 +-#include ++#include + + /* 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 ++#include + #include + + #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 0000000..ec5de36 --- /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 +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 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 0000000..17625e5 --- /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 0000000..8f8ddd6 --- /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: +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 0000000..384926d --- /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 0000000..1dd0b5e --- /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 0000000..60c68ef --- /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 0000000..3dc0a48 --- /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 + #include + #include ++#include + + #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 0000000..c163a1e --- /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 +To: Andrew Morton +Cc: Dan Kegel , 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 , Dan Kegel , + 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 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!Q38FFV628KZY4XSH8D1KK%-F#@>'J\]^[>V6_@6@LU\919H#?PL=%F +MXG$E?+,N\[P2OA3&QJ^:QL;'BZ868YLY?O=YS&_;$?4C9$\ON3:P:O]%YY3=J_D^4 +M$ (\R^')V? +M@82,8'2Y5Q6-7OA""'.,3AZA:?O>)3BWJA?I3?Z"*G>@#RND49R&PW0_0\O-^RN)C,R\ +MNCVM2MD9UB_#4'" X8@&$8D?A5+ +M7(FU*JT1[@J?S869M:I<67/,M%%=9D!W;MTLN(&?6@VE!EZM^4:#>] (Z;O +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 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 0000000..1193a8c --- /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 0000000..b349ee0 --- /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 0000000..58e376d --- /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 + #include + +-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 0000000..a87e12e --- /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 0000000..c1df43d --- /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 0000000..60f02e3 --- /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 0000000..829f0d9 --- /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 + +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 ++#include ++#include ++#include ++ ++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 + #include +@@ -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 0000000..ec5de36 --- /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 +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 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 0000000..829f0d9 --- /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 + +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 ++#include ++#include ++#include ++ ++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 + #include +@@ -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 0000000..326cdcd --- /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 0000000..ec5de36 --- /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 +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 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 0000000..c9e0dd3 --- /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 +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 0000000..326cdcd --- /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 0000000..ec5de36 --- /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 +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 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 0000000..71d4e23 --- /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 0000000..f638a00 --- /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 +Subject: Re: Kernel Compile Error: use of old and new-style options to set FPU type +From: Marc Britten +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 0000000..6472c17 --- /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 +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-$(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) $@ +--- linux-2.6.8/arch/sparc/boot/Makefile.old 2004-09-21 21:46:18.000000000 -0700 ++++ linux-2.6.8/arch/sparc/boot/Makefile 2004-09-21 21:52:35.000000000 -0700 +@@ -19,7 +19,7 @@ + + BTOBJS := $(HEAD_Y) $(INIT_Y) + BTLIBS := $(CORE_Y) $(LIBS_Y) $(DRIVERS_Y) $(NET_Y) +-LDFLAGS_image := -T arch/sparc/kernel/vmlinux.lds.s $(BTOBJS) --start-group $(BTLIBS) --end-group $(kallsyms.o) ++LDFLAGS_image := -T arch/sparc/kernel/vmlinux.lds.asm $(BTOBJS) --start-group $(BTLIBS) --end-group $(kallsyms.o) + + # Actual linking + $(obj)/image: $(obj)/btfix.o FORCE +--- linux-2.6.8/arch/sh64/Makefile.old 2004-09-21 21:46:18.000000000 -0700 ++++ linux-2.6.8/arch/sh64/Makefile 2004-09-21 21:54:31.000000000 -0700 +@@ -71,7 +71,7 @@ + + prepare: include/asm-$(ARCH)/asm-offsets.h arch/$(ARCH)/lib/syscalltab.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) + +--- linux-2.6.8/arch/sh64/boot/compressed/Makefile.old 2004-09-21 21:46:18.000000000 -0700 ++++ linux-2.6.8/arch/sh64/boot/compressed/Makefile 2004-09-21 21:54:41.000000000 -0700 +@@ -25,7 +25,7 @@ + ZIMAGE_OFFSET = $(shell printf "0x%8x" $$[$(CONFIG_MEMORY_START)+0x400000+0x10000]) + + LDFLAGS_vmlinux := -Ttext $(ZIMAGE_OFFSET) -e startup \ +- -T $(obj)/../../kernel/vmlinux.lds.s \ ++ -T $(obj)/../../kernel/vmlinux.lds.asm \ + --no-warn-mismatch + + $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o FORCE +@@ -41,6 +41,6 @@ + LDFLAGS_piggy.o := -r --format binary --oformat elf32-sh64-linux -T + OBJCOPYFLAGS += -R .empty_zero_page + +-$(obj)/piggy.o: $(obj)/vmlinux.lds.s $(obj)/vmlinux.bin.gz FORCE ++$(obj)/piggy.o: $(obj)/vmlinux.lds.asm $(obj)/vmlinux.bin.gz FORCE + $(call if_changed,ld) + diff --git a/patches/linux/2.6.8/linux-2.6.8-m68k-kludge.patch b/patches/linux/2.6.8/linux-2.6.8-m68k-kludge.patch new file mode 100644 index 0000000..9cef549 --- /dev/null +++ b/patches/linux/2.6.8/linux-2.6.8-m68k-kludge.patch @@ -0,0 +1,285 @@ +[ This patch not accepted into kernel for now - it touches the core too much - + but it's ok for crosstool since we just want to check whether toolchain is ok, + I think. I had to rediff the sched.h changes with -U5 to get them to + apply properly -- patch got confused with just three lines of context?! -dank ] + +Date: Sun, 5 Sep 2004 12:41:08 +0200 (CEST) +From: Geert Uytterhoeven +Sender: geert@linux-m68k.org +To: Dan Kegel +cc: Roman Zippel , + Matthias Urlichs , + Linux Kernel Mailing List , + Linux/m68k +Subject: Re: Getting kernel.org kernel to build for m68k? +In-Reply-To: +Message-ID: + +On Wed, 1 Sep 2004, Geert Uytterhoeven wrote: +> On Tue, 31 Aug 2004, Dan Kegel wrote: +> > I noticed today that Linus's m68k kernel can't be built (at least with gcc-3.4.1). +> > +> > The first problem I ran into, +> > CC arch/m68k/kernel/asm-offsets.s +> > In file included from include/linux/spinlock.h:12, +> > from include/linux/capability.h:45, +> > from include/linux/sched.h:7, +> > from arch/m68k/kernel/asm-offsets.c:12: +> > include/linux/thread_info.h:30: error: parse error before '{' token +> > is solved already in the m68k tree. +> > (In particular, +> > the #ifndef __HAVE_THREAD_FUNCTIONS ... #endif in +> > http://linux-m68k-cvs.apia.dhs.org/c/cvsweb/linux/include/linux/thread_info.h?rev=1.5;content-type=text%2Fplain +> > probably solves it.) +> > There are other problems after that. +> +> Roman Zippel changed the threading stuff on m68k. Since it would affect other +> architectures, I never submitted it on my own. +> +> In short, we never really compile this code, since the m68k tree doesn't use it +> anymore. And yes, it even fails with older compiler versions, like 2.95.2. + +The second part doesn't seem to be true: the code is used. And it does compile +after applying the fixes below, even with gcc 3.4.1. + +> > Any chance you could spend a bit of time sending Linus enough +> > patches for his kernel to build for m68k, if not run? +> +> I'll make sure a plain kernel.org kernel can build an m68k kernel. + +The patch below makes the plain kernel.org 2.6.8.1 compile for m68k, +using gcc 2.95.2 or 3.3.3 (3.4.1 needs a few more changes in random +places). The resulting kernel (I booted the gcc 2.95.2 case) works fine on my +Amiga. + +It's more or less the patch created by Matthias Urlichs last year, so +the credits are his: + +| This change implements a reasonable compromise between the task_info->flags +| variable in other ports, which is too much work in the syscall path on m68k, +| and moving the whole structure to thread_struct, which is way too intrusive +| on other ports. + +The patch does affect generic code a bit, but the collateral damage is +kept to a minimum. + +We can still keep Roman's thread info abstractions[*] in Linux/m68k CVS, but +I'd really like the plain kernel.org kernel to be in a working state as well. +That way more people may do cross-compile tests for m68k. + +Hence if no one objects, I'll submit the patch to Andrew and Linus. + +All comments are welcome! + +--- linux-2.6.8.1/arch/m68k/kernel/asm-offsets.c 2004-04-28 15:48:59.000000000 +0200 ++++ linux-m68k-2.6.8.1/arch/m68k/kernel/asm-offsets.c 2004-09-05 12:04:00.000000000 +0200 +@@ -31,6 +31,7 @@ int main(void) + DEFINE(TASK_SIGPENDING, offsetof(struct task_struct, thread.work.sigpending)); + DEFINE(TASK_NOTIFY_RESUME, offsetof(struct task_struct, thread.work.notify_resume)); + DEFINE(TASK_THREAD, offsetof(struct task_struct, thread)); ++ DEFINE(TASK_TINFO, offsetof(struct task_struct, thread_info)); + DEFINE(TASK_MM, offsetof(struct task_struct, mm)); + DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm)); + +@@ -45,6 +46,9 @@ int main(void) + DEFINE(THREAD_FPCNTL, offsetof(struct thread_struct, fpcntl)); + DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fpstate)); + ++ /* offsets into the thread_info struct */ ++ DEFINE(TINFO_PREEMPT, offsetof(struct thread_info, preempt_count)); ++ + /* offsets into the pt_regs */ + DEFINE(PT_D0, offsetof(struct pt_regs, d0)); + DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0)); +--- linux-2.6.8.1/arch/m68k/kernel/entry.S 2004-05-24 11:13:22.000000000 +0200 ++++ linux-m68k-2.6.8.1/arch/m68k/kernel/entry.S 2004-09-02 20:13:12.000000000 +0200 +@@ -134,13 +134,13 @@ ENTRY(system_call) + + syscall_exit_work: + btst #5,%sp@(PT_SR) | check if returning to kernel +- bnes 1b | if so, skip resched, signals ++ bnes 1b | if so, skip everything + tstw %d0 +- jeq do_signal_return ++ jeq do_signal_return | jump if only sig_pending or notify_resume + tstb %d0 +- jne do_delayed_trace ++ jne do_delayed_trace | jump if delayed_trace + +- pea resume_userspace ++ pea resume_userspace | need_resched is set + jmp schedule + + ret_from_exception: +@@ -223,10 +223,14 @@ ENTRY(nmi_handler) + */ + inthandler: + SAVE_ALL_INT +- GET_CURRENT(%d0) +- addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2) +- | put exception # in d0 +- bfextu %sp@(PT_VECTOR){#4,#10},%d0 ++ /* GET_CURRENT(%d0) */ ++ movel %sp,%d0 ++ andw #-THREAD_SIZE,%d0 ++ movel %d0,%a1 ++ addqb #1,%a1@(TINFO_PREEMPT+2) ++ movel %a1@,%curptr ++ ++ bfextu %sp@(PT_VECTOR){#4,#10},%d0 | put exception # in d0 + + movel %sp,%sp@- + movel %d0,%sp@- | put vector # on stack +@@ -243,7 +247,8 @@ inthandler: + 3: addql #8,%sp | pop parameters off stack + + ret_from_interrupt: +- subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2) ++ movel %curptr@(TASK_TINFO),%a1 ++ subqb #1,%a1@(TINFO_PREEMPT+2) + jeq 1f + 2: + RESTORE_ALL +--- linux-2.6.8.1/include/asm-m68k/processor.h 2004-04-28 15:49:03.000000000 +0200 ++++ linux-m68k-2.6.8.1/include/asm-m68k/processor.h 2004-09-02 20:29:32.000000000 +0200 +@@ -84,7 +84,6 @@ struct thread_struct { + ksp: sizeof(init_stack) + (unsigned long) init_stack, \ + sr: PS_S, \ + fs: __KERNEL_DS, \ +- info: INIT_THREAD_INFO(init_task) \ + } + + /* +--- linux-2.6.8.1/include/asm-m68k/thread_info.h 2004-05-24 11:13:53.000000000 +0200 ++++ linux-m68k-2.6.8.1/include/asm-m68k/thread_info.h 2004-09-05 12:19:47.000000000 +0200 +@@ -6,7 +6,7 @@ + #include + + struct thread_info { +- struct task_struct *task; /* main task structure */ ++ struct task_struct *task; /* main task structure, must be first! */ + struct exec_domain *exec_domain; /* execution domain */ + __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ + __u32 cpu; /* should always be 0 on m68k */ +@@ -21,7 +21,8 @@ struct thread_info { + { \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ +- .restart_block = { \ ++ .preempt_count = 1, \ ++ .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ + } +@@ -35,10 +36,11 @@ struct thread_info { + #define free_thread_info(ti) free_pages((unsigned long)(ti),1) + #endif /* PAGE_SHIFT == 13 */ + +-//#define init_thread_info (init_task.thread.info) ++#define init_thread_info (init_thread_union.thread_info) + #define init_stack (init_thread_union.stack) + +-#define current_thread_info() (current->thread_info) ++register __u32 current_thread_info_reg asm("sp"); ++#define current_thread_info() ((struct thread_info *)(current_thread_info_reg & ~0x1fff)) + + + #define __HAVE_THREAD_FUNCTIONS +@@ -91,8 +93,12 @@ extern int thread_flag_fixme(void); + }) + + #define __get_set_tsk_thread_flag(tsk, flag, val) ({ \ +- int __res = __get_tsk_thread_flag(tsk, flag); \ ++ int __res; \ ++ unsigned long __flags; \ ++ local_irq_save(__flags); \ ++ __res = __get_tsk_thread_flag(tsk, flag); \ + __set_tsk_thread_flag(tsk, flag, val); \ ++ local_irq_restore(__flags); \ + __res; \ + }) + +@@ -105,7 +111,4 @@ extern int thread_flag_fixme(void); + #define clear_thread_flag(flag) clear_tsk_thread_flag(current, flag) + #define test_thread_flag(flag) test_tsk_thread_flag(current, flag) + +-#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) +-#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) +- + #endif /* _ASM_M68K_THREAD_INFO_H */ +--- linux-2.6.8/include/linux/sched.h.old 2004-09-13 21:48:58.000000000 -0700 ++++ linux-2.6.8/include/linux/sched.h 2004-09-13 21:50:26.000000000 -0700 +@@ -975,10 +975,11 @@ + task_unlock(task); + + return mm; + } + ++#ifndef __HAVE_THREAD_FUNCTIONS + + /* set thread flags in other task's structures + * - see asm/thread_info.h for TIF_xxxx flags available + */ + static inline void set_tsk_thread_flag(struct task_struct *tsk, int flag) +@@ -1004,10 +1005,12 @@ + static inline int test_tsk_thread_flag(struct task_struct *tsk, int flag) + { + return test_ti_thread_flag(tsk->thread_info,flag); + } + ++#endif /* __HAVE_THREAD_FUNCTIONS */ ++ + static inline void set_tsk_need_resched(struct task_struct *tsk) + { + set_tsk_thread_flag(tsk,TIF_NEED_RESCHED); + } + +--- linux-2.6.8.1/include/linux/thread_info.h 2004-04-27 20:42:22.000000000 +0200 ++++ linux-m68k-2.6.8.1/include/linux/thread_info.h 2004-09-04 21:24:36.000000000 +0200 +@@ -21,6 +21,7 @@ extern long do_no_restart_syscall(struct + #include + + #ifdef __KERNEL__ ++#ifndef __HAVE_THREAD_FUNCTIONS + + /* + * flag set/clear/test wrappers +@@ -77,16 +78,11 @@ static inline int test_ti_thread_flag(st + return test_bit(flag,&ti->flags); + } + +-static inline void set_need_resched(void) +-{ +- set_thread_flag(TIF_NEED_RESCHED); +-} ++#endif /* __HAVE_THREAD_FUNCTIONS */ + +-static inline void clear_need_resched(void) +-{ +- clear_thread_flag(TIF_NEED_RESCHED); +-} ++#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) ++#define clear_need_resched(void) clear_thread_flag(TIF_NEED_RESCHED) + +-#endif ++#endif /* __KERNEL__ */ + + #endif /* _LINUX_THREAD_INFO_H */ + +Gr{oetje,eeting}s, + + Geert + +[*] For reference: + + http://linux-m68k-cvs.ubb.ca/~geert/linux-m68k-2.6.x-merging/POSTPONED/156-thread_info.diff + +-- +Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org + +In personal conversations with technical people, I call myself a hacker. But +when I'm talking to journalists I just say "programmer" or something like that. + -- Linus Torvalds + + + diff --git a/patches/linux/2.6.8/linux-2.6.8-noshared-kconfig.patch b/patches/linux/2.6.8/linux-2.6.8-noshared-kconfig.patch new file mode 100644 index 0000000..326cdcd --- /dev/null +++ b/patches/linux/2.6.8/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/uClibc/0.9.28.1/000-string-functions.patch b/patches/uClibc/0.9.28.1/000-string-functions.patch new file mode 100644 index 0000000..ab6c255 --- /dev/null +++ b/patches/uClibc/0.9.28.1/000-string-functions.patch @@ -0,0 +1,14 @@ +Give preference to target-optimised functions over glibc's ones, +which in turn ahave precedence over generic ones. + +--- uClibc.orig/libc/Makefile 2005-07-20 08:10:44.000000000 +0200 ++++ uclibc/libc/Makefile 2005-07-28 13:33:40.000000000 +0200 +@@ -59,7 +59,7 @@ + $(AR) dN 2 $(LIBNAME) $$objs && \ + $(AR) dN 2 $(LIBNAME) $$objs + @for objfile in obj.signal \ +- obj.string.generic obj.string.$(TARGET_ARCH) obj.string \ ++ obj.string obj.string.generic obj.string.$(TARGET_ARCH) \ + obj.sysdeps.common obj.sysdeps.$(TARGET_ARCH) ; do \ + if [ -e $$objfile ] ; then \ + echo $(AR) $(ARFLAGS) $(LIBNAME) $$objfile ; \ diff --git a/patches/uClibc/0.9.28.1/001-install_dev.patch b/patches/uClibc/0.9.28.1/001-install_dev.patch new file mode 100644 index 0000000..2fefe83 --- /dev/null +++ b/patches/uClibc/0.9.28.1/001-install_dev.patch @@ -0,0 +1,22 @@ +We know that the kernel headers are in place. Don't try to install them. + +diff -dur uClibc-0.9.28.1.orig/Makefile uClibc-0.9.28.1/Makefile +--- uClibc-0.9.28.1.orig/Makefile 2007-01-28 06:38:00.000000000 +0100 ++++ uClibc-0.9.28.1/Makefile 2007-01-28 18:55:46.000000000 +0100 +@@ -158,12 +158,10 @@ + $(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)lib + $(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)include + -$(INSTALL) -m 644 lib/*.[ao] $(PREFIX)$(DEVEL_PREFIX)lib/ +- if [ "$(KERNEL_SOURCE)" = "$(DEVEL_PREFIX)" ] ; then \ +- extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \ +- else \ +- extra_exclude="" ; \ +- fi ; \ +- tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \ ++ extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \ ++ tar -chf - include --exclude .svn --exclude CVS \ ++ --exclude include/linux \ ++ --exclude include/asm'*' \ + | tar -xf - -C $(PREFIX)$(DEVEL_PREFIX) + ifneq ($(strip $(UCLIBC_HAS_FLOATS)),y) + # Remove floating point related headers since float support is disabled. diff --git a/patches/uClibc/0.9.28.1/002-no_LFS-no_readahead.patch b/patches/uClibc/0.9.28.1/002-no_LFS-no_readahead.patch new file mode 100644 index 0000000..ca0568c --- /dev/null +++ b/patches/uClibc/0.9.28.1/002-no_LFS-no_readahead.patch @@ -0,0 +1,14 @@ +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile 2007-01-26 00:54:19.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile 2007-02-01 08:44:37.000000000 +0100 +@@ -25,6 +25,10 @@ + SRCS := $(filter-out sbrk.c,$(SRCS)) + endif + ++ifneq ($(strip $(UCLIBC_HAS_LFS)),y) ++SRCS := $(filter-out readahead.c,$(SRCS)) ++endif ++ + ifneq ($(strip $(UCLIBC_HAS_SSP)),y) + SRCS := $(filter-out ssp.c,$(SRCS)) + endif diff --git a/patches/uClibc/0.9.28.1/003-time-locale.patch b/patches/uClibc/0.9.28.1/003-time-locale.patch new file mode 100644 index 0000000..f449ad6 --- /dev/null +++ b/patches/uClibc/0.9.28.1/003-time-locale.patch @@ -0,0 +1,15 @@ +Index: libc/misc/time/time.c +=================================================================== +--- a/libc/misc/time/time.c (revision 17534) ++++ b/libc/misc/time/time.c (revision 17647) +@@ -158,7 +158,9 @@ + #endif + + #if defined (L_tzset) || defined (L_localtime_r) || defined(L_strftime) || \ +- defined(L__time_mktime) || defined(L__time_mktime_tzi) ++ defined(L__time_mktime) || defined(L__time_mktime_tzi) || \ ++ ((defined(L_strftime) || defined(L_strftime_l)) && \ ++ defined(__UCLIBC_HAS_XLOCALE__)) + + void _time_tzset (int); + diff --git a/patches/uClibc/0.9.28.1/004-uClibc_ctype.patch b/patches/uClibc/0.9.28.1/004-uClibc_ctype.patch new file mode 100644 index 0000000..b07ccdb --- /dev/null +++ b/patches/uClibc/0.9.28.1/004-uClibc_ctype.patch @@ -0,0 +1,17 @@ +diff -urN uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h +--- uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h Fri Jun 3 13:30:25 2005 ++++ uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h Fri Jun 3 13:30:39 2005 +@@ -34,11 +34,11 @@ + + /* glibc uses the equivalent of - typedef __int32_t __ctype_touplow_t; */ + +-typedef __uint16_t __ctype_mask_t; ++typedef __uint32_t __ctype_mask_t; + + #ifdef __UCLIBC_HAS_CTYPE_SIGNED__ + +-typedef __int16_t __ctype_touplow_t; ++typedef __int32_t __ctype_touplow_t; + #define __UCLIBC_CTYPE_B_TBL_OFFSET 128 + #define __UCLIBC_CTYPE_TO_TBL_OFFSET 128 + diff --git a/patches/uClibc/0.9.28.1/200-custom-ISA.patch b/patches/uClibc/0.9.28.1/200-custom-ISA.patch new file mode 100644 index 0000000..2cc9bcb --- /dev/null +++ b/patches/uClibc/0.9.28.1/200-custom-ISA.patch @@ -0,0 +1,31 @@ +diff -dur uClibc-0.9.28.orig/Rules.mak uClibc-0.9.28/Rules.mak +--- uClibc-0.9.28.orig/Rules.mak 2005-08-18 00:49:49.000000000 +0200 ++++ uClibc-0.9.28/Rules.mak 2007-01-30 10:53:34.000000000 +0100 +@@ -168,6 +168,7 @@ + CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4 + CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32 + CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32 ++ CPU_CFLAGS-$(CONFIG_MIPS_ISA_CUSTOM)+=-march=$(CONFIG_MIPS_CPU_CFLAGS_CUSTOM) + endif + + ifeq ($(strip $(TARGET_ARCH)),sh) +diff -dur uClibc-0.9.28.orig/extra/Configs/Config.mips uClibc-0.9.28/extra/Configs/Config.mips +--- uClibc-0.9.28.orig/extra/Configs/Config.mips 2005-08-18 00:49:41.000000000 +0200 ++++ uClibc-0.9.28/extra/Configs/Config.mips 2007-01-30 10:52:12.000000000 +0100 +@@ -63,4 +63,16 @@ + config CONFIG_MIPS_ISA_MIPS64 + bool "MIPS64" + ++config CONFIG_MIPS_ISA_CUSTOM ++ bool "Custom" ++ + endchoice ++ ++config CONFIG_MIPS_CPU_CFLAGS_CUSTOM ++ string ++ prompt "Custon ISA" ++ depends on CONFIG_MIPS_ISA_CUSTOM ++ default "" ++ help ++ Enter your custom ISA here (eg: lx4189!). ++ diff --git a/patches/uClibc/0.9.28.1/201-mips-asm.h.patch b/patches/uClibc/0.9.28.1/201-mips-asm.h.patch new file mode 100644 index 0000000..285feed --- /dev/null +++ b/patches/uClibc/0.9.28.1/201-mips-asm.h.patch @@ -0,0 +1,41 @@ +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S 2007-02-07 10:41:34.000000000 +0100 +@@ -24,7 +24,7 @@ + #include + #define _ERRNO_H 1 + #include +-#include ++#include + + /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */ + +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S 2007-02-07 11:16:52.000000000 +0100 +@@ -3,9 +3,9 @@ + /*see uClibc's sh/pipe.c and glibc-2.2.4's mips/pipe.S */ + + #include +-#include ++#include + #include +-#include ++#include + + .globl pipe + .ent pipe, 0 +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S 2007-02-07 11:17:03.000000000 +0100 +@@ -17,8 +17,8 @@ + 02111-1307 USA. */ + + #include +-#include +-#include ++#include ++#include + + #ifdef __PIC__ + .option pic2 diff --git a/patches/uClibc/0.9.28.2/000-string-functions.patch b/patches/uClibc/0.9.28.2/000-string-functions.patch new file mode 100644 index 0000000..ab6c255 --- /dev/null +++ b/patches/uClibc/0.9.28.2/000-string-functions.patch @@ -0,0 +1,14 @@ +Give preference to target-optimised functions over glibc's ones, +which in turn ahave precedence over generic ones. + +--- uClibc.orig/libc/Makefile 2005-07-20 08:10:44.000000000 +0200 ++++ uclibc/libc/Makefile 2005-07-28 13:33:40.000000000 +0200 +@@ -59,7 +59,7 @@ + $(AR) dN 2 $(LIBNAME) $$objs && \ + $(AR) dN 2 $(LIBNAME) $$objs + @for objfile in obj.signal \ +- obj.string.generic obj.string.$(TARGET_ARCH) obj.string \ ++ obj.string obj.string.generic obj.string.$(TARGET_ARCH) \ + obj.sysdeps.common obj.sysdeps.$(TARGET_ARCH) ; do \ + if [ -e $$objfile ] ; then \ + echo $(AR) $(ARFLAGS) $(LIBNAME) $$objfile ; \ diff --git a/patches/uClibc/0.9.28.2/001-install_dev.patch b/patches/uClibc/0.9.28.2/001-install_dev.patch new file mode 100644 index 0000000..4b42467 --- /dev/null +++ b/patches/uClibc/0.9.28.2/001-install_dev.patch @@ -0,0 +1,22 @@ +We know that the kernel headers are in place. Don't try to install them. + +diff -dur uClibc-0.9.28.1.orig/Makefile uClibc-0.9.28.1/Makefile +--- uClibc-0.9.28.1.orig/Makefile 2007-01-28 06:38:00.000000000 +0100 ++++ uClibc-0.9.28.1/Makefile 2007-01-28 18:55:46.000000000 +0100 +@@ -158,12 +158,10 @@ + $(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)lib + $(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)include + -$(INSTALL) -m 644 lib/*.[ao] $(PREFIX)$(DEVEL_PREFIX)lib/ +- if [ "$(KERNEL_SOURCE)" = "$(DEVEL_PREFIX)" ] ; then \ +- extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \ +- else \ +- extra_exclude="" ; \ +- fi ; \ +- tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \ ++ extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \ ++ tar -chf - include --exclude .svn --exclude CVS \ ++ --exclude include/linux \ ++ --exclude include/asm'*' \ + | tar -xf - -C $(PREFIX)$(DEVEL_PREFIX) + echo '/* Dont use _syscall#() macros; use the syscall() function */' > \ + $(PREFIX)$(DEVEL_PREFIX)include/bits/syscalls.h diff --git a/patches/uClibc/0.9.28.2/002-no_LFS-no_readahead.patch b/patches/uClibc/0.9.28.2/002-no_LFS-no_readahead.patch new file mode 100644 index 0000000..ca0568c --- /dev/null +++ b/patches/uClibc/0.9.28.2/002-no_LFS-no_readahead.patch @@ -0,0 +1,14 @@ +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile 2007-01-26 00:54:19.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile 2007-02-01 08:44:37.000000000 +0100 +@@ -25,6 +25,10 @@ + SRCS := $(filter-out sbrk.c,$(SRCS)) + endif + ++ifneq ($(strip $(UCLIBC_HAS_LFS)),y) ++SRCS := $(filter-out readahead.c,$(SRCS)) ++endif ++ + ifneq ($(strip $(UCLIBC_HAS_SSP)),y) + SRCS := $(filter-out ssp.c,$(SRCS)) + endif diff --git a/patches/uClibc/0.9.28.2/004-uClibc_ctype.patch b/patches/uClibc/0.9.28.2/004-uClibc_ctype.patch new file mode 100644 index 0000000..b07ccdb --- /dev/null +++ b/patches/uClibc/0.9.28.2/004-uClibc_ctype.patch @@ -0,0 +1,17 @@ +diff -urN uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h +--- uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h Fri Jun 3 13:30:25 2005 ++++ uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h Fri Jun 3 13:30:39 2005 +@@ -34,11 +34,11 @@ + + /* glibc uses the equivalent of - typedef __int32_t __ctype_touplow_t; */ + +-typedef __uint16_t __ctype_mask_t; ++typedef __uint32_t __ctype_mask_t; + + #ifdef __UCLIBC_HAS_CTYPE_SIGNED__ + +-typedef __int16_t __ctype_touplow_t; ++typedef __int32_t __ctype_touplow_t; + #define __UCLIBC_CTYPE_B_TBL_OFFSET 128 + #define __UCLIBC_CTYPE_TO_TBL_OFFSET 128 + diff --git a/patches/uClibc/0.9.28.2/200-custom-ISA.patch b/patches/uClibc/0.9.28.2/200-custom-ISA.patch new file mode 100644 index 0000000..2cc9bcb --- /dev/null +++ b/patches/uClibc/0.9.28.2/200-custom-ISA.patch @@ -0,0 +1,31 @@ +diff -dur uClibc-0.9.28.orig/Rules.mak uClibc-0.9.28/Rules.mak +--- uClibc-0.9.28.orig/Rules.mak 2005-08-18 00:49:49.000000000 +0200 ++++ uClibc-0.9.28/Rules.mak 2007-01-30 10:53:34.000000000 +0100 +@@ -168,6 +168,7 @@ + CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4 + CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32 + CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32 ++ CPU_CFLAGS-$(CONFIG_MIPS_ISA_CUSTOM)+=-march=$(CONFIG_MIPS_CPU_CFLAGS_CUSTOM) + endif + + ifeq ($(strip $(TARGET_ARCH)),sh) +diff -dur uClibc-0.9.28.orig/extra/Configs/Config.mips uClibc-0.9.28/extra/Configs/Config.mips +--- uClibc-0.9.28.orig/extra/Configs/Config.mips 2005-08-18 00:49:41.000000000 +0200 ++++ uClibc-0.9.28/extra/Configs/Config.mips 2007-01-30 10:52:12.000000000 +0100 +@@ -63,4 +63,16 @@ + config CONFIG_MIPS_ISA_MIPS64 + bool "MIPS64" + ++config CONFIG_MIPS_ISA_CUSTOM ++ bool "Custom" ++ + endchoice ++ ++config CONFIG_MIPS_CPU_CFLAGS_CUSTOM ++ string ++ prompt "Custon ISA" ++ depends on CONFIG_MIPS_ISA_CUSTOM ++ default "" ++ help ++ Enter your custom ISA here (eg: lx4189!). ++ diff --git a/patches/uClibc/0.9.28.2/201-mips-asm.h.patch b/patches/uClibc/0.9.28.2/201-mips-asm.h.patch new file mode 100644 index 0000000..285feed --- /dev/null +++ b/patches/uClibc/0.9.28.2/201-mips-asm.h.patch @@ -0,0 +1,41 @@ +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S 2007-02-07 10:41:34.000000000 +0100 +@@ -24,7 +24,7 @@ + #include + #define _ERRNO_H 1 + #include +-#include ++#include + + /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */ + +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S 2007-02-07 11:16:52.000000000 +0100 +@@ -3,9 +3,9 @@ + /*see uClibc's sh/pipe.c and glibc-2.2.4's mips/pipe.S */ + + #include +-#include ++#include + #include +-#include ++#include + + .globl pipe + .ent pipe, 0 +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S 2007-02-07 11:17:03.000000000 +0100 +@@ -17,8 +17,8 @@ + 02111-1307 USA. */ + + #include +-#include +-#include ++#include ++#include + + #ifdef __PIC__ + .option pic2 diff --git a/patches/uClibc/0.9.28/000-string-functions.patch b/patches/uClibc/0.9.28/000-string-functions.patch new file mode 100644 index 0000000..4436bfe --- /dev/null +++ b/patches/uClibc/0.9.28/000-string-functions.patch @@ -0,0 +1,11 @@ +--- uClibc.orig/libc/Makefile 2005-07-20 08:10:44.000000000 +0200 ++++ uclibc/libc/Makefile 2005-07-28 13:33:40.000000000 +0200 +@@ -59,7 +59,7 @@ + $(AR) dN 2 $(LIBNAME) $$objs && \ + $(AR) dN 2 $(LIBNAME) $$objs + @for objfile in obj.signal \ +- obj.string.generic obj.string.$(TARGET_ARCH) obj.string \ ++ obj.string obj.string.generic obj.string.$(TARGET_ARCH) \ + obj.sysdeps.common obj.sysdeps.$(TARGET_ARCH) ; do \ + if [ -e $$objfile ] ; then \ + echo $(AR) $(ARFLAGS) $(LIBNAME) $$objfile ; \ diff --git a/patches/uClibc/0.9.28/001-install_dev.patch b/patches/uClibc/0.9.28/001-install_dev.patch new file mode 100644 index 0000000..476525b --- /dev/null +++ b/patches/uClibc/0.9.28/001-install_dev.patch @@ -0,0 +1,39 @@ +There are at least three weird glitches in the Makefile: + - the test operator is a dual-equal sign (==) when it should be a single one (=); + - the exclude options are not accepted as is by GNU tar; + - how on earth could KERNEL_SOURCE possibly be equal to DEVEL_PREFIX ??? + +We (Cedric DUVAL and I, Yann E. MORIN) are not quite sure why it is that way. +We're not quite sure either on how to solve this. + +What we need is to built a toolchain; in no way we need to install the linux headers. + ==> systematically exclude them from the [s]tar command. + +This patch is inspired by the svn repository of uClibc as of 20060209. +diff -dur /home/ymorin/dev/uClibc-0.9.28/Makefile uClibc-0.9.28/Makefile +--- /home/ymorin/dev/uClibc-0.9.28/Makefile 2005-08-18 00:49:49.000000000 +0200 ++++ uClibc-0.9.28/Makefile 2006-02-09 17:06:58.000000000 +0100 +@@ -158,12 +158,17 @@ + $(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)lib + $(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)include + -$(INSTALL) -m 644 lib/*.[ao] $(PREFIX)$(DEVEL_PREFIX)lib/ +- if [ "$(KERNEL_SOURCE)" == "$(DEVEL_PREFIX)" ] ; then \ +- extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \ +- else \ +- extra_exclude="" ; \ +- fi ; \ +- tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \ ++# if [ "$(KERNEL_SOURCE)" == "$(DEVEL_PREFIX)" ] ; then \ ++# extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \ ++# else \ ++# extra_exclude="" ; \ ++# fi ; \ ++# tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \ ++# | tar -xf - -C $(PREFIX)$(DEVEL_PREFIX) ++ printf ".svn\n.cvsignore\nCVS\n" > tar_exclude ; \ ++ ls -1d include/linux include/asm* >> tar_exclude ; \ ++ tar -chf - -X tar_exclude include \ + | tar -xf - -C $(PREFIX)$(DEVEL_PREFIX) ++ rm -f tar_exclude + ifneq ($(strip $(UCLIBC_HAS_FLOATS)),y) + # Remove floating point related headers since float support is disabled. diff --git a/patches/uClibc/0.9.28/002-no_LFS-no_readahead.patch b/patches/uClibc/0.9.28/002-no_LFS-no_readahead.patch new file mode 100644 index 0000000..ca0568c --- /dev/null +++ b/patches/uClibc/0.9.28/002-no_LFS-no_readahead.patch @@ -0,0 +1,14 @@ +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile 2007-01-26 00:54:19.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile 2007-02-01 08:44:37.000000000 +0100 +@@ -25,6 +25,10 @@ + SRCS := $(filter-out sbrk.c,$(SRCS)) + endif + ++ifneq ($(strip $(UCLIBC_HAS_LFS)),y) ++SRCS := $(filter-out readahead.c,$(SRCS)) ++endif ++ + ifneq ($(strip $(UCLIBC_HAS_SSP)),y) + SRCS := $(filter-out ssp.c,$(SRCS)) + endif diff --git a/patches/uClibc/0.9.28/004-uClibc_ctype.patch b/patches/uClibc/0.9.28/004-uClibc_ctype.patch new file mode 100644 index 0000000..b07ccdb --- /dev/null +++ b/patches/uClibc/0.9.28/004-uClibc_ctype.patch @@ -0,0 +1,17 @@ +diff -urN uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h +--- uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h Fri Jun 3 13:30:25 2005 ++++ uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h Fri Jun 3 13:30:39 2005 +@@ -34,11 +34,11 @@ + + /* glibc uses the equivalent of - typedef __int32_t __ctype_touplow_t; */ + +-typedef __uint16_t __ctype_mask_t; ++typedef __uint32_t __ctype_mask_t; + + #ifdef __UCLIBC_HAS_CTYPE_SIGNED__ + +-typedef __int16_t __ctype_touplow_t; ++typedef __int32_t __ctype_touplow_t; + #define __UCLIBC_CTYPE_B_TBL_OFFSET 128 + #define __UCLIBC_CTYPE_TO_TBL_OFFSET 128 + diff --git a/patches/uClibc/0.9.28/005-fix_includes.sh.patch b/patches/uClibc/0.9.28/005-fix_includes.sh.patch new file mode 100644 index 0000000..0311c83 --- /dev/null +++ b/patches/uClibc/0.9.28/005-fix_includes.sh.patch @@ -0,0 +1,316 @@ +--- uClibc-0.9.28/extra/scripts/fix_includes.sh.orig 2006-12-13 05:44:21.000000000 -0700 ++++ uClibc-0.9.28/extra/scripts/fix_includes.sh 2006-12-13 05:44:35.000000000 -0700 +@@ -1,183 +1,155 @@ + #!/bin/sh +-# Copyright (C) 2003 Erik Andersen + # +-# 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. +-# +-# You should have received a copy of the GNU Library 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 +- +-usage () { +- echo "" +- echo "usage: "`basename $0`" -k KERNEL_SOURCE_DIRECTORY -t TARGET_ARCH" +- echo "" +- echo "This utility scans the KERNEL_SOURCE_DIRECTORY directory and" +- echo "checks that it contains well formed kernel headers suitable" +- echo "for inclusion as the include/linux/ directory provided by" +- echo "uClibc." +- echo "" +- echo "If the specified kernel headers are present and already" +- echo "configured for the architecture specified by TARGET_ARCH," +- echo "they will be used as-is." +- echo "" +- echo "If the specified kernel headers are missing entirely, this" +- echo "script will return an error." +- echo "" +- echo "If the specified kernel headers are present, but are either" +- echo "not yet configured or are configured for an architecture" +- echo "different than that specified by TARGET_ARCH, this script" +- echo "will attempt to 'fix' the kernel headers and make them" +- echo "suitable for use by uClibc. This fixing process may fail." +- echo "It is therefore best to always provide kernel headers that" +- echo "are already configured for the selected architecture." +- echo "" +- echo "Most Linux distributions provide 'kernel-headers' packages" +- echo "that are suitable for use by uClibc." +- echo "" +- echo "" +- exit 1; ++# Copyright (C) 2000-2005 Erik Andersen ++# ++# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. ++# ++ ++usage() { ++ echo "" ++ echo "usage: "`basename $0`" -k KERNEL_SOURCE_DIRECTORY -t TARGET_ARCH" ++ echo "" ++ echo "This utility scans the KERNEL_SOURCE_DIRECTORY directory and" ++ echo "checks that it contains well formed kernel headers suitable" ++ echo "for inclusion as the include/linux/ directory provided by" ++ echo "uClibc." ++ echo "" ++ echo "If the specified kernel headers are present and already" ++ echo "configured for the architecture specified by TARGET_ARCH," ++ echo "they will be used as-is." ++ echo "" ++ echo "If the specified kernel headers are missing entirely, this" ++ echo "script will return an error." ++ echo "" ++ echo "If the specified kernel headers are present, but are either" ++ echo "not yet configured or are configured for an architecture" ++ echo "different than that specified by TARGET_ARCH, this script" ++ echo "will attempt to 'fix' the kernel headers and make them" ++ echo "suitable for use by uClibc. This fixing process may fail." ++ echo "It is therefore best to always provide kernel headers that" ++ echo "are already configured for the selected architecture." ++ echo "" ++ echo "Most Linux distributions provide 'kernel-headers' packages" ++ echo "that are suitable for use by uClibc." ++ echo "" ++ echo "" ++ exit 1 + } + +-HAS_MMU="y"; ++ ++# ++# Parse our arguments ++# ++HAS_MMU="y" + while [ -n "$1" ]; do +- case $1 in +- -k ) shift; if [ -n "$1" ]; then KERNEL_SOURCE=$1; shift; else usage; fi; ;; +- -t ) shift; if [ -n "$1" ]; then TARGET_ARCH=$1; shift; else usage; fi; ;; +- -n ) shift; HAS_MMU="n"; ;; +- -* ) usage; ;; +- * ) usage; ;; +- esac; +-done; ++ case $1 in ++ -k ) shift; if [ -n "$1" ]; then KERNEL_SOURCE=$1; shift; else usage; fi; ;; ++ -t ) shift; if [ -n "$1" ]; then TARGET_ARCH=$1; shift; else usage; fi; ;; ++ -n ) shift; HAS_MMU="n"; ;; ++ -* ) usage; ;; ++ * ) usage; ;; ++ esac ++done + +-if [ ! -f "$KERNEL_SOURCE/Makefile" -a ! -f "$KERNEL_SOURCE/include/linux/version.h" ]; then +- echo ""; +- echo ""; +- echo "The file $KERNEL_SOURCE/Makefile or $KERNEL_SOURCE/include/linux/version.h is missing!"; +- echo "Perhaps your kernel source is broken?" +- echo ""; +- echo ""; +- exit 1; +-fi; + +-if [ ! -d "$KERNEL_SOURCE" ]; then +- echo ""; +- echo ""; +- echo "$KERNEL_SOURCE is not a directory"; +- echo ""; +- echo ""; +- exit 1; +-fi; +- +-if [ -f "$KERNEL_SOURCE/Makefile" ] ; then +-# set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION +-eval `sed -n -e 's/^\([A-Z]*\) = \([0-9]*\)$/\1=\2/p' -e 's/^\([A-Z]*\) = \(-[-a-z0-9]*\)$/\1=\2/p' $KERNEL_SOURCE/Makefile` +-else +-ver=`grep UTS_RELEASE $KERNEL_SOURCE/include/linux/version.h | cut -d '"' -f 2` +-VERSION=`echo "$ver" | cut -d '.' -f 1` +-PATCHLEVEL=`echo "$ver" | cut -d '.' -f 2` +-if echo "$ver" | grep -q '-' ; then +-SUBLEVEL=`echo "$ver" | sed "s/${VERSION}.${PATCHLEVEL}.//" | cut -d '-' -f 1` +-EXTRAVERSION=`echo "$ver" | sed "s/${VERSION}.${PATCHLEVEL}.${SUBLEVEL}-//"` +-else +-SUBLEVEL=`echo "$ver" | cut -d '.' -f 3` +-#EXTRAVERSION= +-fi ++# ++# Perform some sanity checks on our kernel sources ++# ++if [ ! -f "$KERNEL_SOURCE/Makefile" -a ! -f "$KERNEL_SOURCE/include/linux/version.h" ]; then ++ echo "" ++ echo "" ++ echo "The file $KERNEL_SOURCE/Makefile or $KERNEL_SOURCE/include/linux/version.h is missing!" ++ echo "Perhaps your kernel source is broken?" ++ echo "" ++ echo "" ++ exit 1 + fi +-if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ] +-then +- echo "Unable to determine version for kernel headers" +- echo -e "\tprovided in directory $KERNEL_SOURCE" +- exit 1 ++if [ ! -d "$KERNEL_SOURCE" ]; then ++ echo "" ++ echo "" ++ echo "$KERNEL_SOURCE is not a directory" ++ echo "" ++ echo "" ++ exit 1 + fi + +-if [ "$MAKE_IS_SILENT" != "y" ]; then +-echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION}" +-echo -e "\n" +-echo "Using kernel headers from $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION} for architecture '$TARGET_ARCH'" +-echo -e "\tprovided in directory $KERNEL_SOURCE" +-echo -e "\n" +-fi + ++# + # Create a symlink to include/asm +- ++# + rm -f include/asm* + if [ ! -d "$KERNEL_SOURCE/include/asm" ]; then +- echo ""; +- echo ""; +- echo "The symlink $KERNEL_SOURCE/include/asm is missing\!"; +- echo "Perhaps you forgot to configure your kernel source?"; +- echo "You really should configure your kernel source tree so I"; +- echo "do not have to try and guess about this sort of thing."; +- echo "" +- echo "Attempting to guess a usable value...."; +- echo "" +- echo ""; +- sleep 1; +- +- if [ "$TARGET_ARCH" = "powerpc" ];then +- set -x; +- ln -fs $KERNEL_SOURCE/include/asm-ppc include/asm; +- set +x; +- elif [ "$TARGET_ARCH" = "mips" ];then +- set -x; +- ln -fs $KERNEL_SOURCE/include/asm-mips include/asm; +- set +x; +- elif [ "$TARGET_ARCH" = "arm" ];then +- set -x; +- ln -fs $KERNEL_SOURCE/include/asm-arm include/asm; +- set +x; +- if [ ! -L $KERNEL_SOURCE/include/asm-arm/proc ] ; then +- if [ ! -L proc ] ; then +- (cd include/asm; +- ln -fs proc-armv proc; +- ln -fs arch-ebsa285 arch); +- fi ++ echo "" ++ echo "" ++ echo "The symlink $KERNEL_SOURCE/include/asm is missing\!" ++ echo "Perhaps you forgot to configure your kernel source?" ++ echo "You really should configure your kernel source tree so I" ++ echo "do not have to try and guess about this sort of thing." ++ echo "" ++ echo "Attempting to guess a usable value...." ++ echo "" ++ echo "" ++ sleep 1 ++ ++ if [ "$TARGET_ARCH" = "powerpc" ]; then ++ set -x ++ ln -fs $KERNEL_SOURCE/include/asm-ppc include/asm ++ set +x ++ elif [ "$TARGET_ARCH" = "mips" ]; then ++ set -x ++ ln -fs $KERNEL_SOURCE/include/asm-mips include/asm ++ set +x ++ elif [ "$TARGET_ARCH" = "arm" ]; then ++ set -x ++ ln -fs $KERNEL_SOURCE/include/asm-arm include/asm ++ set +x ++ if [ ! -L $KERNEL_SOURCE/include/asm-arm/proc ]; then ++ if [ ! -L proc ]; then ++ ( ++ cd include/asm ++ ln -fs proc-armv proc ++ ln -fs arch-ebsa285 arch ++ ) ++ fi ++ fi ++ elif [ "$TARGET_ARCH" = "cris" ]; then ++ set -x ++ ln -fs $KERNEL_SOURCE/include/asm-cris include/asm ++ set +x ++ elif [ "$HAS_MMU" != "y" ]; then ++ if [ -d $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu ]; then ++ set -x ++ ln -fs $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu include/asm ++ set +x ++ else ++ set -x ++ ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm ++ set +x ++ fi ++ else ++ set -x ++ ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm ++ set +x + fi; +- elif [ "$TARGET_ARCH" = "cris" ]; then +- set -x; +- ln -fs $KERNEL_SOURCE/include/asm-cris include/asm; +- set +x; +- elif [ "$HAS_MMU" != "y" ]; then +- if [ -d $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu ] ; then +- set -x; +- ln -fs $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu include/asm; +- set +x; +- else +- set -x; +- ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm; +- set +x; +- fi; +- else +- set -x; +- ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm; +- set +x; +- fi; + else +-# No guessing required..... +-ln -fs $KERNEL_SOURCE/include/asm include/asm +-if [ -e $KERNEL_SOURCE/include/asm-$TARGET_ARCH ] ; then +-ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm-$TARGET_ARCH ++ # No guessing required..... ++ for x in $KERNEL_SOURCE/include/asm* ; do ++ ln -fs ${x} include/ ++ done + fi +-fi; + + ++# + # Annoyingly, 2.6.x kernel headers also need an include/asm-generic/ directory +-if [ $VERSION -eq 2 ] && [ $PATCHLEVEL -ge 6 ] ; then +- ln -fs $KERNEL_SOURCE/include/asm-generic include/asm-generic +-fi; ++# ++if [ -e $KERNEL_SOURCE/include/asm-generic ]; then ++ rm -f include/asm-generic ++ ln -fs $KERNEL_SOURCE/include/asm-generic include/asm-generic ++fi + + ++# + # Create the include/linux symlink. ++# + rm -f include/linux + ln -fs $KERNEL_SOURCE/include/linux include/linux +- diff --git a/patches/uClibc/0.9.28/200-custom-ISA.patch b/patches/uClibc/0.9.28/200-custom-ISA.patch new file mode 100644 index 0000000..2cc9bcb --- /dev/null +++ b/patches/uClibc/0.9.28/200-custom-ISA.patch @@ -0,0 +1,31 @@ +diff -dur uClibc-0.9.28.orig/Rules.mak uClibc-0.9.28/Rules.mak +--- uClibc-0.9.28.orig/Rules.mak 2005-08-18 00:49:49.000000000 +0200 ++++ uClibc-0.9.28/Rules.mak 2007-01-30 10:53:34.000000000 +0100 +@@ -168,6 +168,7 @@ + CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4 + CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32 + CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32 ++ CPU_CFLAGS-$(CONFIG_MIPS_ISA_CUSTOM)+=-march=$(CONFIG_MIPS_CPU_CFLAGS_CUSTOM) + endif + + ifeq ($(strip $(TARGET_ARCH)),sh) +diff -dur uClibc-0.9.28.orig/extra/Configs/Config.mips uClibc-0.9.28/extra/Configs/Config.mips +--- uClibc-0.9.28.orig/extra/Configs/Config.mips 2005-08-18 00:49:41.000000000 +0200 ++++ uClibc-0.9.28/extra/Configs/Config.mips 2007-01-30 10:52:12.000000000 +0100 +@@ -63,4 +63,16 @@ + config CONFIG_MIPS_ISA_MIPS64 + bool "MIPS64" + ++config CONFIG_MIPS_ISA_CUSTOM ++ bool "Custom" ++ + endchoice ++ ++config CONFIG_MIPS_CPU_CFLAGS_CUSTOM ++ string ++ prompt "Custon ISA" ++ depends on CONFIG_MIPS_ISA_CUSTOM ++ default "" ++ help ++ Enter your custom ISA here (eg: lx4189!). ++ diff --git a/patches/uClibc/0.9.28/201-mips-asm.h.patch b/patches/uClibc/0.9.28/201-mips-asm.h.patch new file mode 100644 index 0000000..285feed --- /dev/null +++ b/patches/uClibc/0.9.28/201-mips-asm.h.patch @@ -0,0 +1,41 @@ +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S 2007-02-07 10:41:34.000000000 +0100 +@@ -24,7 +24,7 @@ + #include + #define _ERRNO_H 1 + #include +-#include ++#include + + /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */ + +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S 2007-02-07 11:16:52.000000000 +0100 +@@ -3,9 +3,9 @@ + /*see uClibc's sh/pipe.c and glibc-2.2.4's mips/pipe.S */ + + #include +-#include ++#include + #include +-#include ++#include + + .globl pipe + .ent pipe, 0 +diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S +--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S 2007-02-07 11:18:12.000000000 +0100 ++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S 2007-02-07 11:17:03.000000000 +0100 +@@ -17,8 +17,8 @@ + 02111-1307 USA. */ + + #include +-#include +-#include ++#include ++#include + + #ifdef __PIC__ + .option pic2 diff --git a/samples/arm-qemu-linux-uclibc/crosstool.config b/samples/arm-qemu-linux-uclibc/crosstool.config new file mode 100644 index 0000000..fdbc1af --- /dev/null +++ b/samples/arm-qemu-linux-uclibc/crosstool.config @@ -0,0 +1,388 @@ +# +# Automatically generated make config: don't edit +# crosstool-NG version: 0.0.1 +# Thu Feb 8 21:23:17 2007 +# + +# +# Paths and misc options +# +CT_PARALLEL_JOBS=1 +CT_LOAD=0 +CT_NICE=5 +CT_USE_PIPES=y + +# +# Paths +# +CT_TARBALLS_DIR="${HOME}/dev/src" +CT_SRC_DIR="${HOME}/x-tools/src/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" +CT_BUILD_DIR="${HOME}/x-tools/build/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" +CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}" +CT_INSTALL_DIR="${CT_PREFIX_DIR}" + +# +# Downloading and extracting +# +# CT_NO_DOWNLOAD is not set +# CT_ONLY_DOWNLOAD is not set +# CT_FORCE_DOWNLOAD is not set +# CT_FORCE_EXTRACT is not set + +# +# Logging +# +# CT_LOG_ERROR is not set +# CT_LOG_WARN is not set +# CT_LOG_INFO is not set +CT_LOG_EXTRA=y +# CT_LOG_DEBUG is not set +CT_LOG_LEVEL_MAX="EXTRA" +# CT_LOG_PROGRESS_BAR is not set +# CT_LOG_USE_COLORS is not set +CT_LOG_TO_FILE=y +CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log" + +# +# Target options +# + +# +# General target options +# +CT_ARCH_ARM=y +# CT_ARCH_MIPS is not set +# CT_ARCH_x86 is not set +# CT_ARCH_x86_64 is not set +# CT_ARCH_BE is not set +CT_ARCH_LE=y +# CT_ARCH_FLOAT_HW is not set +CT_ARCH_FLOAT_SW=y + +# +# Target optimisations +# +CT_ARCH_CPU="" +CT_ARCH_TUNE="" +CT_ARCH_ARCH="armv5te" +CT_TARGET_CFLAGS="" + +# +# Toolchain options +# +CT_USE_SYSROOT=y +CT_SHARED_LIBS=y +CT_TARGET_VENDOR="qemu" +CT_TARGET_ALIAS="" +CT_ARCH="arm" +CT_BUILD="" +CT_CC_NATIVE="gcc" +# CT_CANADIAN is not set +CT_HOST="" +CT_HOST_CC="" + +# +# Kernel +# +CT_KERNEL_LINUX=y +# CT_KERNEL_CYGWIN is not set +CT_KERNEL_VERSION="2.6.20" +CT_KERNEL_LINUX_HEADERS_INSTALL=y +# CT_KERNEL_LINUX_HEADERS_SANITISED is not set +# CT_KERNEL_LINUX_HEADERS_COPY is not set +CT_KERNEL="linux" +CT_KERNEL_VERSION_SEE_EXTRAVERSION=y +# CT_KERNEL_INSTALL_V_2_6_18 is not set +# CT_KERNEL_INSTALL_V_2_6_18_1 is not set +# CT_KERNEL_INSTALL_V_2_6_18_2 is not set +# CT_KERNEL_INSTALL_V_2_6_18_3 is not set +# CT_KERNEL_INSTALL_V_2_6_18_4 is not set +# CT_KERNEL_INSTALL_V_2_6_18_5 is not set +# CT_KERNEL_INSTALL_V_2_6_18_6 is not set +# CT_KERNEL_INSTALL_V_2_6_19 is not set +# CT_KERNEL_INSTALL_V_2_6_19_1 is not set +# CT_KERNEL_INSTALL_V_2_6_19_2 is not set +CT_KERNEL_INSTALL_V_2_6_20=y +# CT_KERNEL_COPY_V_2_6_0 is not set +# CT_KERNEL_COPY_V_2_6_1 is not set +# CT_KERNEL_COPY_V_2_6_2 is not set +# CT_KERNEL_COPY_V_2_6_3 is not set +# CT_KERNEL_COPY_V_2_6_4 is not set +# CT_KERNEL_COPY_V_2_6_5 is not set +# CT_KERNEL_COPY_V_2_6_6 is not set +# CT_KERNEL_COPY_V_2_6_7 is not set +# CT_KERNEL_COPY_V_2_6_8 is not set +# CT_KERNEL_COPY_V_2_6_8_1 is not set +# CT_KERNEL_COPY_V_2_6_9 is not set +# CT_KERNEL_COPY_V_2_6_10 is not set +# CT_KERNEL_COPY_V_2_6_11 is not set +# CT_KERNEL_COPY_V_2_6_11_1 is not set +# CT_KERNEL_COPY_V_2_6_11_10 is not set +# CT_KERNEL_COPY_V_2_6_11_11 is not set +# CT_KERNEL_COPY_V_2_6_11_12 is not set +# CT_KERNEL_COPY_V_2_6_11_2 is not set +# CT_KERNEL_COPY_V_2_6_11_3 is not set +# CT_KERNEL_COPY_V_2_6_11_4 is not set +# CT_KERNEL_COPY_V_2_6_11_5 is not set +# CT_KERNEL_COPY_V_2_6_11_6 is not set +# CT_KERNEL_COPY_V_2_6_11_7 is not set +# CT_KERNEL_COPY_V_2_6_11_8 is not set +# CT_KERNEL_COPY_V_2_6_11_9 is not set +# CT_KERNEL_COPY_V_2_6_12 is not set +# CT_KERNEL_COPY_V_2_6_12_1 is not set +# CT_KERNEL_COPY_V_2_6_12_2 is not set +# CT_KERNEL_COPY_V_2_6_12_3 is not set +# CT_KERNEL_COPY_V_2_6_12_4 is not set +# CT_KERNEL_COPY_V_2_6_12_5 is not set +# CT_KERNEL_COPY_V_2_6_12_6 is not set +# CT_KERNEL_COPY_V_2_6_13 is not set +# CT_KERNEL_COPY_V_2_6_13_1 is not set +# CT_KERNEL_COPY_V_2_6_13_2 is not set +# CT_KERNEL_COPY_V_2_6_13_3 is not set +# CT_KERNEL_COPY_V_2_6_13_4 is not set +# CT_KERNEL_COPY_V_2_6_13_5 is not set +# CT_KERNEL_COPY_V_2_6_14 is not set +# CT_KERNEL_COPY_V_2_6_14_1 is not set +# CT_KERNEL_COPY_V_2_6_14_2 is not set +# CT_KERNEL_COPY_V_2_6_14_3 is not set +# CT_KERNEL_COPY_V_2_6_14_4 is not set +# CT_KERNEL_COPY_V_2_6_14_5 is not set +# CT_KERNEL_COPY_V_2_6_14_6 is not set +# CT_KERNEL_COPY_V_2_6_14_7 is not set +# CT_KERNEL_COPY_V_2_6_15 is not set +# CT_KERNEL_COPY_V_2_6_15_1 is not set +# CT_KERNEL_COPY_V_2_6_15_2 is not set +# CT_KERNEL_COPY_V_2_6_15_3 is not set +# CT_KERNEL_COPY_V_2_6_15_4 is not set +# CT_KERNEL_COPY_V_2_6_15_5 is not set +# CT_KERNEL_COPY_V_2_6_15_6 is not set +# CT_KERNEL_COPY_V_2_6_15_7 is not set +# CT_KERNEL_COPY_V_2_6_16 is not set +# CT_KERNEL_COPY_V_2_6_16_1 is not set +# CT_KERNEL_COPY_V_2_6_16_10 is not set +# CT_KERNEL_COPY_V_2_6_16_11 is not set +# CT_KERNEL_COPY_V_2_6_16_12 is not set +# CT_KERNEL_COPY_V_2_6_16_13 is not set +# CT_KERNEL_COPY_V_2_6_16_14 is not set +# CT_KERNEL_COPY_V_2_6_16_15 is not set +# CT_KERNEL_COPY_V_2_6_16_16 is not set +# CT_KERNEL_COPY_V_2_6_16_17 is not set +# CT_KERNEL_COPY_V_2_6_16_18 is not set +# CT_KERNEL_COPY_V_2_6_16_19 is not set +# CT_KERNEL_COPY_V_2_6_16_2 is not set +# CT_KERNEL_COPY_V_2_6_16_20 is not set +# CT_KERNEL_COPY_V_2_6_16_21 is not set +# CT_KERNEL_COPY_V_2_6_16_22 is not set +# CT_KERNEL_COPY_V_2_6_16_23 is not set +# CT_KERNEL_COPY_V_2_6_16_24 is not set +# CT_KERNEL_COPY_V_2_6_16_25 is not set +# CT_KERNEL_COPY_V_2_6_16_26 is not set +# CT_KERNEL_COPY_V_2_6_16_27 is not set +# CT_KERNEL_COPY_V_2_6_16_28 is not set +# CT_KERNEL_COPY_V_2_6_16_29 is not set +# CT_KERNEL_COPY_V_2_6_16_3 is not set +# CT_KERNEL_COPY_V_2_6_16_30 is not set +# CT_KERNEL_COPY_V_2_6_16_31 is not set +# CT_KERNEL_COPY_V_2_6_16_32 is not set +# CT_KERNEL_COPY_V_2_6_16_33 is not set +# CT_KERNEL_COPY_V_2_6_16_34 is not set +# CT_KERNEL_COPY_V_2_6_16_35 is not set +# CT_KERNEL_COPY_V_2_6_16_36 is not set +# CT_KERNEL_COPY_V_2_6_16_4 is not set +# CT_KERNEL_COPY_V_2_6_16_5 is not set +# CT_KERNEL_COPY_V_2_6_16_6 is not set +# CT_KERNEL_COPY_V_2_6_16_7 is not set +# CT_KERNEL_COPY_V_2_6_16_8 is not set +# CT_KERNEL_COPY_V_2_6_16_9 is not set +# CT_KERNEL_COPY_V_2_6_17 is not set +# CT_KERNEL_COPY_V_2_6_17_1 is not set +# CT_KERNEL_COPY_V_2_6_17_10 is not set +# CT_KERNEL_COPY_V_2_6_17_11 is not set +# CT_KERNEL_COPY_V_2_6_17_12 is not set +# CT_KERNEL_COPY_V_2_6_17_13 is not set +# CT_KERNEL_COPY_V_2_6_17_14 is not set +# CT_KERNEL_COPY_V_2_6_17_2 is not set +# CT_KERNEL_COPY_V_2_6_17_3 is not set +# CT_KERNEL_COPY_V_2_6_17_4 is not set +# CT_KERNEL_COPY_V_2_6_17_5 is not set +# CT_KERNEL_COPY_V_2_6_17_6 is not set +# CT_KERNEL_COPY_V_2_6_17_7 is not set +# CT_KERNEL_COPY_V_2_6_17_8 is not set +# CT_KERNEL_COPY_V_2_6_17_9 is not set +# CT_KERNEL_COPY_V_2_6_18 is not set +# CT_KERNEL_COPY_V_2_6_18_1 is not set +# CT_KERNEL_COPY_V_2_6_18_2 is not set +# CT_KERNEL_COPY_V_2_6_18_3 is not set +# CT_KERNEL_COPY_V_2_6_18_4 is not set +# CT_KERNEL_COPY_V_2_6_18_5 is not set +# CT_KERNEL_COPY_V_2_6_18_6 is not set +# CT_KERNEL_COPY_V_2_6_19 is not set +# CT_KERNEL_COPY_V_2_6_19_1 is not set +# CT_KERNEL_SANITISED_V_2_6_7_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_1 is not set +# CT_KERNEL_SANITISED_V_2_6_9_0 is not set +# CT_KERNEL_SANITISED_V_2_6_9_1 is not set +# CT_KERNEL_SANITISED_V_2_6_10_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_1 is not set +# CT_KERNEL_SANITISED_V_2_6_11_2 is not set +# CT_KERNEL_SANITISED_V_2_6_12_0 is not set +CT_KERNEL_LINUX_VERBOSITY_0=y +# CT_KERNEL_LINUX_VERBOSITY_1 is not set +# CT_KERNEL_LINUX_VERBOSITY_2 is not set +CT_KERNEL_LINUX_VERBOSE_LEVEL=0 +CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config" + +# +# binutils +# +CT_BINUTILS_VERSION="2.17.50.0.10" +# CT_BINUTILS_V_2_11_2 is not set +# CT_BINUTILS_V_2_13_90 is not set +# CT_BINUTILS_V_2_14 is not set +# CT_BINUTILS_V_2_14_90 is not set +# CT_BINUTILS_V_2_14_92 is not set +# CT_BINUTILS_V_2_15 is not set +# CT_BINUTILS_V_2_15_90 is not set +# CT_BINUTILS_V_2_15_91 is not set +# CT_BINUTILS_V_2_16 is not set +# CT_BINUTILS_V_2_16_1 is not set +# CT_BINUTILS_V_2_17 is not set +# CT_BINUTILS_V_2_17_50_0_1 is not set +# CT_BINUTILS_V_2_17_50_0_2 is not set +# CT_BINUTILS_V_2_17_50_0_3 is not set +# CT_BINUTILS_V_2_17_50_0_4 is not set +# CT_BINUTILS_V_2_17_50_0_5 is not set +# CT_BINUTILS_V_2_17_50_0_6 is not set +# CT_BINUTILS_V_2_17_50_0_7 is not set +# CT_BINUTILS_V_2_17_50_0_8 is not set +# CT_BINUTILS_V_2_17_50_0_9 is not set +CT_BINUTILS_V_2_17_50_0_10=y +CT_BINUTILS_EXTRA_CONFIG="" + +# +# C compiler +# + +# +# Core C Compiler (used to build the C library) +# +# CT_CC_USE_CORE is not set +CT_CC_CORE_GCC=y +# CT_CC_CORE_TCC is not set +CT_CC_CORE_VERSION="" +CT_CC_CORE="gcc" +# CT_CC_CORE_V_2_95_3 is not set +# CT_CC_CORE_V_3_2_3 is not set +# CT_CC_CORE_V_3_3 is not set +# CT_CC_CORE_V_3_3_1 is not set +# CT_CC_CORE_V_3_3_2 is not set +# CT_CC_CORE_V_3_3_3 is not set +# CT_CC_CORE_V_3_3_4 is not set +# CT_CC_CORE_V_3_3_5 is not set +# CT_CC_CORE_V_3_3_6 is not set +# CT_CC_CORE_V_3_4_0 is not set +# CT_CC_CORE_V_3_4_1 is not set +# CT_CC_CORE_V_3_4_2 is not set +# CT_CC_CORE_V_3_4_3 is not set +# CT_CC_CORE_V_3_4_4 is not set +# CT_CC_CORE_V_3_4_5 is not set +# CT_CC_CORE_V_3_4_6 is not set +# CT_CC_CORE_V_4_0_0 is not set +# CT_CC_CORE_V_4_0_1 is not set +# CT_CC_CORE_V_4_0_2 is not set +# CT_CC_CORE_V_4_0_3 is not set +# CT_CC_CORE_V_4_0_4 is not set +# CT_CC_CORE_V_4_1_0 is not set +# CT_CC_CORE_V_4_1_1 is not set +CT_CC_CORE_EXTRA_CONFIG="" + +# +# Final C compiler +# +CT_CC_GCC=y +CT_CC_VERSION="4.1.1" +CT_CC="gcc" +# CT_CC_V_2_95_3 is not set +# CT_CC_V_3_2_3 is not set +# CT_CC_V_3_3 is not set +# CT_CC_V_3_3_1 is not set +# CT_CC_V_3_3_2 is not set +# CT_CC_V_3_3_3 is not set +# CT_CC_V_3_3_4 is not set +# CT_CC_V_3_3_5 is not set +# CT_CC_V_3_3_6 is not set +# CT_CC_V_3_4_0 is not set +# CT_CC_V_3_4_1 is not set +# CT_CC_V_3_4_2 is not set +# CT_CC_V_3_4_3 is not set +# CT_CC_V_3_4_4 is not set +# CT_CC_V_3_4_5 is not set +# CT_CC_V_4_0_0 is not set +# CT_CC_V_4_0_1 is not set +# CT_CC_V_4_0_2 is not set +# CT_CC_V_4_0_3 is not set +# CT_CC_V_4_0_4 is not set +# CT_CC_V_4_1_0 is not set +CT_CC_V_4_1_1=y +CT_CC_EXTRA_CONFIG="" +CT_CC_SUPPORT_C=y +CT_CC_SUPPORT_CXX=y +CT_CC_SUPPORT_JAVA=y + +# +# Supported languages: +# +CT_CC_LANG_C=y +# CT_CC_LANG_CXX is not set +# CT_CC_LANG_JAVA is not set + +# +# C-library +# +# CT_LIBC_GLIBC is not set +CT_LIBC_UCLIBC=y +CT_LIBC_VERSION="0.9.28.1" +CT_LIBC="uClibc" +# CT_LIBC_V_1_09_1 is not set +# CT_LIBC_V_2_0_1 is not set +# CT_LIBC_V_2_0_6 is not set +# CT_LIBC_V_2_1_1 is not set +# CT_LIBC_V_2_1_2 is not set +# CT_LIBC_V_2_1_3 is not set +# CT_LIBC_V_2_2 is not set +# CT_LIBC_V_2_2_1 is not set +# CT_LIBC_V_2_2_2 is not set +# CT_LIBC_V_2_2_3 is not set +# CT_LIBC_V_2_2_4 is not set +# CT_LIBC_V_2_2_5 is not set +# CT_LIBC_V_2_3 is not set +# CT_LIBC_V_2_3_1 is not set +# CT_LIBC_V_2_3_2 is not set +# CT_LIBC_V_2_3_3 is not set +# CT_LIBC_V_2_3_4 is not set +# CT_LIBC_V_2_3_5 is not set +# CT_LIBC_V_2_3_6 is not set +# CT_LIBC_V_2_4 is not set +# CT_LIBC_V_2_5 is not set +# CT_LIBC_GLIBC_THREADS_NPTL is not set +# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set +# CT_LIBC_GLIBC_THREADS_NONE is not set +CT_LIBC_GLIBC_EXTRA_CONFIG="" +CT_LIBC_GLIBC_EXTRA_CFLAGS="" +CT_LIBC_EXTRA_CC_ARGS="" +CT_LIBC_GLIBC_CONFIGPARMS="" +CT_LIBC_ADDONS="" +# CT_LIBC_V_snapshot is not set +# CT_LIBC_V_specific_date is not set +# CT_LIBC_V_0_9_26 is not set +# CT_LIBC_V_0_9_27 is not set +# CT_LIBC_V_0_9_28 is not set +CT_LIBC_V_0_9_28_1=y +CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y +# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set +# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set +CT_LIBC_UCLIBC_DEBUG_LEVEL=0 +CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config" +# CT_LIBC_UCLIBC_LOCALES is not set diff --git a/samples/arm-qemu-linux-uclibc/linux-2.6.20.config b/samples/arm-qemu-linux-uclibc/linux-2.6.20.config new file mode 100644 index 0000000..1de6c95 --- /dev/null +++ b/samples/arm-qemu-linux-uclibc/linux-2.6.20.config @@ -0,0 +1,997 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.20 +# Thu Feb 8 19:19:07 2007 +# +CONFIG_ARM=y +# CONFIG_GENERIC_TIME is not set +CONFIG_MMU=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="-qemu" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_IPC_NS is not set +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_UTS_NS is not set +# CONFIG_AUDIT is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_SYSFS_DEPRECATED=y +# CONFIG_RELAY is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +# CONFIG_IOSCHED_AS is not set +# CONFIG_IOSCHED_DEADLINE is not set +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +CONFIG_ARCH_VERSATILE=y +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_OMAP is not set + +# +# Versatile platform type +# +CONFIG_ARCH_VERSATILE_PB=y +# CONFIG_MACH_VERSATILE_AB is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_ARM926T=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5TJ=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_COPY_V4WB=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +CONFIG_ARM_THUMB=y +CONFIG_CPU_ICACHE_DISABLE=y +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set +CONFIG_ARM_VIC=y +CONFIG_ICST307=y + +# +# Bus support +# +CONFIG_ARM_AMBA=y +CONFIG_PCI=y +# CONFIG_PCI_DEBUG is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +CONFIG_HZ=100 +# CONFIG_AEABI is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="root=1f03 mem=32M" +# CONFIG_XIP_KERNEL is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +# CONFIG_FPE_NWFPE is not set +# CONFIG_FPE_FASTFPE is not set +# CONFIG_VFP is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +# CONFIG_PM is not set +# CONFIG_APM is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IPV6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set +# CONFIG_MTD_CFI_NOSWAP is not set +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SX8 is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +# CONFIG_SCSI is not set +# CONFIG_SCSI_NETLINK is not set + +# +# Serial ATA (prod) and Parallel ATA (experimental) drivers +# +# CONFIG_ATA is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NET_VENDOR_3COM is not set +CONFIG_SMC91X=y +# CONFIG_DM9000 is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_HP100 is not set +# CONFIG_NET_PCI is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set +# CONFIG_SKY2 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set +# CONFIG_QLA3XXX is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_CHELSIO_T1 is not set +# CONFIG_IXGB is not set +# CONFIG_S2IO is not set +# CONFIG_MYRI10GE is not set +# CONFIG_NETXEN_NIC is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_AMBAKMI is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PCI=m +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL011 is not set +CONFIG_SERIAL_CORE=m +# CONFIG_SERIAL_JSM is not set +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_NVRAM is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_DRM is not set +# CONFIG_RAW_DRIVER is not set + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +# CONFIG_HWMON is not set +# CONFIG_HWMON_VID is not set + +# +# Misc devices +# +# CONFIG_SGI_IOC4 is not set +# CONFIG_TIFM_CORE is not set + +# +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +# CONFIG_USB_DABUSB is not set + +# +# Graphics support +# +CONFIG_FIRMWARE_EDID=y +CONFIG_FB=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +CONFIG_FB_ARMCLCD=y +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +# CONFIG_FONT_8x16 is not set +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +CONFIG_FONT_ACORN_8x8=y +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_10x18 is not set + +# +# Logo configuration +# +# CONFIG_LOGO is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# HID Devices +# +# CONFIG_HID is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +CONFIG_USB_DYNAMIC_MINORS=y +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=m +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_UHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +# CONFIG_USB_HID is not set + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_ACECAD is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_TOUCHSCREEN is not set +# CONFIG_USB_YEALINK is not set +# CONFIG_USB_XPAD is not set +# CONFIG_USB_ATI_REMOTE is not set +# CONFIG_USB_ATI_REMOTE2 is not set +# CONFIG_USB_KEYSPAN_REMOTE is not set +# CONFIG_USB_APPLETOUCH is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET_MII is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_MON is not set + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_TEST is not set + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +# CONFIG_MMC is not set + +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +# CONFIG_RTC_CLASS is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4DEV_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_MINIX_FS=y +CONFIG_ROMFS_FS=y +# CONFIG_INOTIFY is not set +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +# CONFIG_MSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +# CONFIG_TMPFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_SQUASHFS_VMALLOC is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +# CONFIG_NLS is not set + +# +# Distributed Lock Manager +# +# CONFIG_DLM is not set + +# +# Profiling support +# +# CONFIG_PROFILING is not set + +# +# Kernel hacking +# +CONFIG_PRINTK_TIME=y +# CONFIG_ENABLE_MUST_CHECK is not set +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +CONFIG_FRAME_POINTER=y +# CONFIG_FORCED_INLINING is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_DEBUG_USER is not set +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_LL is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_PLIST=y +CONFIG_IOMAP_COPY=y diff --git a/samples/arm-qemu-linux-uclibc/uClibc-0.9.28.1.config b/samples/arm-qemu-linux-uclibc/uClibc-0.9.28.1.config new file mode 100644 index 0000000..3bd0dc1 --- /dev/null +++ b/samples/arm-qemu-linux-uclibc/uClibc-0.9.28.1.config @@ -0,0 +1,169 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +TARGET_arm=y +# TARGET_bfin is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +# TARGET_mips is not set +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sh64 is not set +# TARGET_sparc is not set +# TARGET_v850 is not set +# TARGET_x86_64 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="arm" +ARCH_SUPPORTS_BIG_ENDIAN=y +# CONFIG_GENERIC_ARM is not set +# CONFIG_ARM610 is not set +# CONFIG_ARM710 is not set +# CONFIG_ARM720T is not set +# CONFIG_ARM920T is not set +# CONFIG_ARM922T is not set +# CONFIG_ARM926T is not set +# CONFIG_ARM1136JF_S is not set +# CONFIG_ARM_SA110 is not set +# CONFIG_ARM_SA1100 is not set +CONFIG_ARM_XSCALE=y +ARCH_LITTLE_ENDIAN=y +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +# HAS_FPU is not set +UCLIBC_HAS_SOFT_FLOAT=y +DO_C99_MATH=y +KERNEL_SOURCE="/usr/src/linux" +C_SYMBOL_PREFIX="" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +LDSO_CACHE_SUPPORT=y +# LDSO_PRELOAD_FILE_SUPPORT is not set +LDSO_BASE_FILENAME="ld.so" +# LDSO_RUNPATH is not set +# DL_FINI_CRT_COMPAT is not set +UCLIBC_CTOR_DTOR=y +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +# PTHREADS_DEBUG_SUPPORT is not set +UCLIBC_HAS_LFS=y +UCLIBC_STATIC_LDCONFIG=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +# MALLOC_GLIBC_COMPAT is not set +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +UNIX98PTY_ONLY=y +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +# UCLIBC_HAS_TZ_CACHING is not set +UCLIBC_HAS_TZ_FILE=y +# UCLIBC_HAS_TZ_FILE_READ_MANY is not set +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +# UCLIBC_HAS_IPV6 is not set +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_STRING_GENERIC_OPT=y +UCLIBC_HAS_STRING_ARCH_OPT=y +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +# UCLIBC_HAS_CTYPE_CHECKED is not set +UCLIBC_HAS_CTYPE_ENFORCED=y +# UCLIBC_HAS_WCHAR is not set +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +# UCLIBC_HAS_GLIBC_CUSTOM_PRINTF is not set +# USE_OLD_VFPRINTF is not set +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT=y +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +UCLIBC_HAS_FOPEN_LARGEFILE_MODE=y +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +UCLIBC_HAS_WORDEXP=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="$(RUNTIME_PREFIX)lib" +RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/" +DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/" + +# +# uClibc security related options +# +# UCLIBC_SECURITY is not set + +# +# uClibc development/debugging options +# +CROSS_COMPILER_PREFIX="" +# DODEBUG is not set +# DODEBUG_PT is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +WARNINGS="-Wall" +# UCLIBC_MJN3_ONLY is not set diff --git a/samples/armeb-unknown-linux-gnu/crosstool.config b/samples/armeb-unknown-linux-gnu/crosstool.config new file mode 100644 index 0000000..e59523a --- /dev/null +++ b/samples/armeb-unknown-linux-gnu/crosstool.config @@ -0,0 +1,377 @@ +# +# Automatically generated make config: don't edit +# crosstool-NG version: 0.0.1 +# Fri Jan 26 19:25:07 2007 +# + +# +# Paths and misc options +# +CT_PARALLEL_JOBS=1 +CT_NICE=0 + +# +# Paths +# +CT_TARBALLS_DIR="${HOME}/dev/src" +CT_SRC_DIR="${HOME}/x-tools/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}/src" +CT_BUILD_DIR="${HOME}/x-tools/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}/build" +CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}" +CT_INSTALL_DIR="${CT_PREFIX_DIR}" + +# +# Downloading and extracting +# +# CT_NO_DOWNLOAD is not set +# CT_ONLY_DOWNLOAD is not set +# CT_FORCE_DOWNLOAD is not set +# CT_FORCE_EXTRACT is not set + +# +# Logging +# +# CT_LOG_ERROR is not set +# CT_LOG_WARN is not set +# CT_LOG_INFO is not set +CT_LOG_EXTRA=y +# CT_LOG_DEBUG is not set +CT_LOG_LEVEL_MAX="EXTRA" +# CT_LOG_PROGRESS_BAR is not set +# CT_LOG_USE_COLORS is not set +CT_LOG_TO_FILE=y +CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log" + +# +# Target options +# + +# +# General target options +# +CT_ARCH_ARM=y +# CT_ARCH_MIPS is not set +# CT_ARCH_x86 is not set +# CT_ARCH_x86_64 is not set +CT_ARCH_BE=y +# CT_ARCH_LE is not set +# CT_ARCH_FLOAT_HW is not set +CT_ARCH_FLOAT_SW=y + +# +# Target optimisations +# +CT_ARCH_CPU="xscale" +CT_ARCH_TUNE="xscale" +CT_ARCH_ARCH="armv5te" +CT_TARGET_CFLAGS="" + +# +# Toolchain options +# +CT_USE_SYSROOT=y +CT_SHARED_LIBS=y +CT_TARGET_VENDOR="unknown" +CT_ARCH="arm" +CT_BUILD="" +CT_CC_NATIVE="gcc" +# CT_CANADIAN is not set +CT_HOST="" +CT_HOST_CC="" + +# +# Kernel +# +CT_KERNEL_LINUX=y +# CT_KERNEL_CYGWIN is not set +CT_KERNEL_VERSION="2.6.19.1" +CT_KERNEL_LINUX_HEADERS_INSTALL=y +# CT_KERNEL_LINUX_HEADERS_SANITISED is not set +# CT_KERNEL_LINUX_HEADERS_COPY is not set +CT_KERNEL="linux" +CT_KERNEL_VERSION_SEE_EXTRAVERSION=y +# CT_KERNEL_INSTALL_V_2_6_18 is not set +# CT_KERNEL_INSTALL_V_2_6_18_1 is not set +# CT_KERNEL_INSTALL_V_2_6_18_2 is not set +# CT_KERNEL_INSTALL_V_2_6_18_3 is not set +# CT_KERNEL_INSTALL_V_2_6_18_4 is not set +# CT_KERNEL_INSTALL_V_2_6_18_5 is not set +# CT_KERNEL_INSTALL_V_2_6_18_6 is not set +# CT_KERNEL_INSTALL_V_2_6_19 is not set +CT_KERNEL_INSTALL_V_2_6_19_1=y +# CT_KERNEL_COPY_V_2_6_0 is not set +# CT_KERNEL_COPY_V_2_6_1 is not set +# CT_KERNEL_COPY_V_2_6_2 is not set +# CT_KERNEL_COPY_V_2_6_3 is not set +# CT_KERNEL_COPY_V_2_6_4 is not set +# CT_KERNEL_COPY_V_2_6_5 is not set +# CT_KERNEL_COPY_V_2_6_6 is not set +# CT_KERNEL_COPY_V_2_6_7 is not set +# CT_KERNEL_COPY_V_2_6_8 is not set +# CT_KERNEL_COPY_V_2_6_8_1 is not set +# CT_KERNEL_COPY_V_2_6_9 is not set +# CT_KERNEL_COPY_V_2_6_10 is not set +# CT_KERNEL_COPY_V_2_6_11 is not set +# CT_KERNEL_COPY_V_2_6_11_1 is not set +# CT_KERNEL_COPY_V_2_6_11_10 is not set +# CT_KERNEL_COPY_V_2_6_11_11 is not set +# CT_KERNEL_COPY_V_2_6_11_12 is not set +# CT_KERNEL_COPY_V_2_6_11_2 is not set +# CT_KERNEL_COPY_V_2_6_11_3 is not set +# CT_KERNEL_COPY_V_2_6_11_4 is not set +# CT_KERNEL_COPY_V_2_6_11_5 is not set +# CT_KERNEL_COPY_V_2_6_11_6 is not set +# CT_KERNEL_COPY_V_2_6_11_7 is not set +# CT_KERNEL_COPY_V_2_6_11_8 is not set +# CT_KERNEL_COPY_V_2_6_11_9 is not set +# CT_KERNEL_COPY_V_2_6_12 is not set +# CT_KERNEL_COPY_V_2_6_12_1 is not set +# CT_KERNEL_COPY_V_2_6_12_2 is not set +# CT_KERNEL_COPY_V_2_6_12_3 is not set +# CT_KERNEL_COPY_V_2_6_12_4 is not set +# CT_KERNEL_COPY_V_2_6_12_5 is not set +# CT_KERNEL_COPY_V_2_6_12_6 is not set +# CT_KERNEL_COPY_V_2_6_13 is not set +# CT_KERNEL_COPY_V_2_6_13_1 is not set +# CT_KERNEL_COPY_V_2_6_13_2 is not set +# CT_KERNEL_COPY_V_2_6_13_3 is not set +# CT_KERNEL_COPY_V_2_6_13_4 is not set +# CT_KERNEL_COPY_V_2_6_13_5 is not set +# CT_KERNEL_COPY_V_2_6_14 is not set +# CT_KERNEL_COPY_V_2_6_14_1 is not set +# CT_KERNEL_COPY_V_2_6_14_2 is not set +# CT_KERNEL_COPY_V_2_6_14_3 is not set +# CT_KERNEL_COPY_V_2_6_14_4 is not set +# CT_KERNEL_COPY_V_2_6_14_5 is not set +# CT_KERNEL_COPY_V_2_6_14_6 is not set +# CT_KERNEL_COPY_V_2_6_14_7 is not set +# CT_KERNEL_COPY_V_2_6_15 is not set +# CT_KERNEL_COPY_V_2_6_15_1 is not set +# CT_KERNEL_COPY_V_2_6_15_2 is not set +# CT_KERNEL_COPY_V_2_6_15_3 is not set +# CT_KERNEL_COPY_V_2_6_15_4 is not set +# CT_KERNEL_COPY_V_2_6_15_5 is not set +# CT_KERNEL_COPY_V_2_6_15_6 is not set +# CT_KERNEL_COPY_V_2_6_15_7 is not set +# CT_KERNEL_COPY_V_2_6_16 is not set +# CT_KERNEL_COPY_V_2_6_16_1 is not set +# CT_KERNEL_COPY_V_2_6_16_10 is not set +# CT_KERNEL_COPY_V_2_6_16_11 is not set +# CT_KERNEL_COPY_V_2_6_16_12 is not set +# CT_KERNEL_COPY_V_2_6_16_13 is not set +# CT_KERNEL_COPY_V_2_6_16_14 is not set +# CT_KERNEL_COPY_V_2_6_16_15 is not set +# CT_KERNEL_COPY_V_2_6_16_16 is not set +# CT_KERNEL_COPY_V_2_6_16_17 is not set +# CT_KERNEL_COPY_V_2_6_16_18 is not set +# CT_KERNEL_COPY_V_2_6_16_19 is not set +# CT_KERNEL_COPY_V_2_6_16_2 is not set +# CT_KERNEL_COPY_V_2_6_16_20 is not set +# CT_KERNEL_COPY_V_2_6_16_21 is not set +# CT_KERNEL_COPY_V_2_6_16_22 is not set +# CT_KERNEL_COPY_V_2_6_16_23 is not set +# CT_KERNEL_COPY_V_2_6_16_24 is not set +# CT_KERNEL_COPY_V_2_6_16_25 is not set +# CT_KERNEL_COPY_V_2_6_16_26 is not set +# CT_KERNEL_COPY_V_2_6_16_27 is not set +# CT_KERNEL_COPY_V_2_6_16_28 is not set +# CT_KERNEL_COPY_V_2_6_16_29 is not set +# CT_KERNEL_COPY_V_2_6_16_3 is not set +# CT_KERNEL_COPY_V_2_6_16_30 is not set +# CT_KERNEL_COPY_V_2_6_16_31 is not set +# CT_KERNEL_COPY_V_2_6_16_32 is not set +# CT_KERNEL_COPY_V_2_6_16_33 is not set +# CT_KERNEL_COPY_V_2_6_16_34 is not set +# CT_KERNEL_COPY_V_2_6_16_35 is not set +# CT_KERNEL_COPY_V_2_6_16_36 is not set +# CT_KERNEL_COPY_V_2_6_16_4 is not set +# CT_KERNEL_COPY_V_2_6_16_5 is not set +# CT_KERNEL_COPY_V_2_6_16_6 is not set +# CT_KERNEL_COPY_V_2_6_16_7 is not set +# CT_KERNEL_COPY_V_2_6_16_8 is not set +# CT_KERNEL_COPY_V_2_6_16_9 is not set +# CT_KERNEL_COPY_V_2_6_17 is not set +# CT_KERNEL_COPY_V_2_6_17_1 is not set +# CT_KERNEL_COPY_V_2_6_17_10 is not set +# CT_KERNEL_COPY_V_2_6_17_11 is not set +# CT_KERNEL_COPY_V_2_6_17_12 is not set +# CT_KERNEL_COPY_V_2_6_17_13 is not set +# CT_KERNEL_COPY_V_2_6_17_14 is not set +# CT_KERNEL_COPY_V_2_6_17_2 is not set +# CT_KERNEL_COPY_V_2_6_17_3 is not set +# CT_KERNEL_COPY_V_2_6_17_4 is not set +# CT_KERNEL_COPY_V_2_6_17_5 is not set +# CT_KERNEL_COPY_V_2_6_17_6 is not set +# CT_KERNEL_COPY_V_2_6_17_7 is not set +# CT_KERNEL_COPY_V_2_6_17_8 is not set +# CT_KERNEL_COPY_V_2_6_17_9 is not set +# CT_KERNEL_COPY_V_2_6_18 is not set +# CT_KERNEL_COPY_V_2_6_18_1 is not set +# CT_KERNEL_COPY_V_2_6_18_2 is not set +# CT_KERNEL_COPY_V_2_6_18_3 is not set +# CT_KERNEL_COPY_V_2_6_18_4 is not set +# CT_KERNEL_COPY_V_2_6_18_5 is not set +# CT_KERNEL_COPY_V_2_6_18_6 is not set +# CT_KERNEL_COPY_V_2_6_19 is not set +# CT_KERNEL_COPY_V_2_6_19_1 is not set +# CT_KERNEL_SANITISED_V_2_6_7_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_1 is not set +# CT_KERNEL_SANITISED_V_2_6_9_0 is not set +# CT_KERNEL_SANITISED_V_2_6_9_1 is not set +# CT_KERNEL_SANITISED_V_2_6_10_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_1 is not set +# CT_KERNEL_SANITISED_V_2_6_11_2 is not set +# CT_KERNEL_SANITISED_V_2_6_12_0 is not set +CT_KERNEL_LINUX_VERBOSITY_0=y +# CT_KERNEL_LINUX_VERBOSITY_1 is not set +# CT_KERNEL_LINUX_VERBOSITY_2 is not set +CT_KERNEL_LINUX_VERBOSE_LEVEL=0 +CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config" + +# +# binutils +# +CT_BINUTILS_VERSION="2.17.50.0.8" +# CT_BINUTILS_V_2_11_2 is not set +# CT_BINUTILS_V_2_13_90 is not set +# CT_BINUTILS_V_2_14 is not set +# CT_BINUTILS_V_2_14_90 is not set +# CT_BINUTILS_V_2_14_92 is not set +# CT_BINUTILS_V_2_15 is not set +# CT_BINUTILS_V_2_15_90 is not set +# CT_BINUTILS_V_2_15_91 is not set +# CT_BINUTILS_V_2_16 is not set +# CT_BINUTILS_V_2_16_1 is not set +# CT_BINUTILS_V_2_17 is not set +# CT_BINUTILS_V_2_17_50_0_1 is not set +# CT_BINUTILS_V_2_17_50_0_2 is not set +# CT_BINUTILS_V_2_17_50_0_3 is not set +# CT_BINUTILS_V_2_17_50_0_4 is not set +# CT_BINUTILS_V_2_17_50_0_5 is not set +# CT_BINUTILS_V_2_17_50_0_6 is not set +# CT_BINUTILS_V_2_17_50_0_7 is not set +CT_BINUTILS_V_2_17_50_0_8=y +CT_BINUTILS_EXTRA_CONFIG="" + +# +# C compiler +# + +# +# Core C Compiler (used to build the C library) +# +# CT_CC_USE_CORE is not set +CT_CC_CORE_GCC=y +# CT_CC_CORE_TCC is not set +CT_CC_CORE_VERSION="" +CT_CC_CORE="gcc" +# CT_CC_CORE_V_2_95_3 is not set +# CT_CC_CORE_V_3_2_3 is not set +# CT_CC_CORE_V_3_3 is not set +# CT_CC_CORE_V_3_3_1 is not set +# CT_CC_CORE_V_3_3_2 is not set +# CT_CC_CORE_V_3_3_3 is not set +# CT_CC_CORE_V_3_3_4 is not set +# CT_CC_CORE_V_3_3_5 is not set +# CT_CC_CORE_V_3_3_6 is not set +# CT_CC_CORE_V_3_4_0 is not set +# CT_CC_CORE_V_3_4_1 is not set +# CT_CC_CORE_V_3_4_2 is not set +# CT_CC_CORE_V_3_4_3 is not set +# CT_CC_CORE_V_3_4_4 is not set +# CT_CC_CORE_V_3_4_5 is not set +# CT_CC_CORE_V_3_4_6 is not set +# CT_CC_CORE_V_4_0_0 is not set +# CT_CC_CORE_V_4_0_1 is not set +# CT_CC_CORE_V_4_0_2 is not set +# CT_CC_CORE_V_4_0_3 is not set +# CT_CC_CORE_V_4_1_0 is not set +# CT_CC_CORE_V_4_1_1 is not set +CT_CC_CORE_EXTRA_CONFIG="" + +# +# Final C compiler +# +CT_CC_GCC=y +CT_CC_VERSION="3.4.4" +CT_CC="gcc" +# CT_CC_V_2_95_3 is not set +# CT_CC_V_3_2_3 is not set +# CT_CC_V_3_3 is not set +# CT_CC_V_3_3_1 is not set +# CT_CC_V_3_3_2 is not set +# CT_CC_V_3_3_3 is not set +# CT_CC_V_3_3_4 is not set +# CT_CC_V_3_3_5 is not set +# CT_CC_V_3_3_6 is not set +# CT_CC_V_3_4_0 is not set +# CT_CC_V_3_4_1 is not set +# CT_CC_V_3_4_2 is not set +# CT_CC_V_3_4_3 is not set +CT_CC_V_3_4_4=y +# CT_CC_V_3_4_5 is not set +# CT_CC_V_4_0_0 is not set +# CT_CC_V_4_0_1 is not set +# CT_CC_V_4_0_2 is not set +# CT_CC_V_4_1_0 is not set +# CT_CC_V_4_1_1 is not set +CT_CC_EXTRA_CONFIG="" +CT_CC_SUPPORT_C=y +CT_CC_SUPPORT_CXX=y +CT_CC_SUPPORT_JAVA=y + +# +# Supported languages: +# +CT_CC_LANG_C=y +# CT_CC_LANG_CXX is not set +# CT_CC_LANG_JAVA is not set + +# +# C-library +# +# CT_LIBC_GLIBC is not set +CT_LIBC_UCLIBC=y +CT_LIBC_VERSION="20070103" +CT_LIBC="uClibc" +# CT_LIBC_V_1_09_1 is not set +# CT_LIBC_V_2_0_1 is not set +# CT_LIBC_V_2_0_6 is not set +# CT_LIBC_V_2_1_1 is not set +# CT_LIBC_V_2_1_2 is not set +# CT_LIBC_V_2_1_3 is not set +# CT_LIBC_V_2_2 is not set +# CT_LIBC_V_2_2_1 is not set +# CT_LIBC_V_2_2_2 is not set +# CT_LIBC_V_2_2_3 is not set +# CT_LIBC_V_2_2_4 is not set +# CT_LIBC_V_2_2_5 is not set +# CT_LIBC_V_2_3 is not set +# CT_LIBC_V_2_3_1 is not set +# CT_LIBC_V_2_3_2 is not set +# CT_LIBC_V_2_3_3 is not set +# CT_LIBC_V_2_3_4 is not set +# CT_LIBC_V_2_3_5 is not set +# CT_LIBC_V_2_3_6 is not set +# CT_LIBC_V_2_4 is not set +# CT_LIBC_V_2_5 is not set +# CT_LIBC_GLIBC_THREADS_NPTL is not set +# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set +# CT_LIBC_GLIBC_THREADS_NONE is not set +CT_LIBC_GLIBC_EXTRA_CONFIG="" +CT_LIBC_GLIBC_EXTRA_CFLAGS="" +CT_LIBC_EXTRA_CC_ARGS="" +CT_LIBC_GLIBC_CONFIGPARMS="" +CT_LIBC_ADDONS="" +# CT_LIBC_V_snapshot is not set +CT_LIBC_V_specific_date=y +# CT_LIBC_V_0_9_26 is not set +# CT_LIBC_V_0_9_27 is not set +# CT_LIBC_V_0_9_28 is not set +CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y +# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set +# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set +CT_LIBC_UCLIBC_DEBUG_LEVEL=0 +CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config" +# CT_LIBC_UCLIBC_LOCALES is not set diff --git a/samples/armeb-unknown-linux-gnu/linux-2.6.19.1.config b/samples/armeb-unknown-linux-gnu/linux-2.6.19.1.config new file mode 100644 index 0000000..a3c490c --- /dev/null +++ b/samples/armeb-unknown-linux-gnu/linux-2.6.19.1.config @@ -0,0 +1,1197 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.19.1 +# Sat Dec 23 17:36:49 2006 +# +CONFIG_ARM=y +CONFIG_GENERIC_TIME=y +CONFIG_MMU=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="-nslu2" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_IPC_NS is not set +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_UTS_NS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +# CONFIG_RELAY is not set +CONFIG_INITRAMFS_SOURCE="" +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# +CONFIG_BLOCK=y +# CONFIG_BLK_DEV_IO_TRACE is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +CONFIG_ARCH_IXP4XX=y +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_OMAP is not set +CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y + +# +# Intel IXP4xx Implementation Options +# + +# +# IXP4xx Platforms +# +CONFIG_MACH_NSLU2=y +# CONFIG_ARCH_AVILA is not set +# CONFIG_ARCH_ADI_COYOTE is not set +# CONFIG_ARCH_IXDP425 is not set +# CONFIG_MACH_IXDPG425 is not set +# CONFIG_MACH_IXDP465 is not set +# CONFIG_ARCH_PRPMC1100 is not set +# CONFIG_MACH_NAS100D is not set +# CONFIG_MACH_GTWX5715 is not set + +# +# IXP4xx Options +# +CONFIG_DMABOUNCE=y +# CONFIG_IXP4XX_INDIRECT_PCI is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_XSCALE=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5T=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +CONFIG_ARM_THUMB=y +CONFIG_CPU_BIG_ENDIAN=y +# CONFIG_CPU_DCACHE_DISABLE is not set +CONFIG_XSCALE_PMU=y + +# +# Bus support +# +CONFIG_PCI=y +# CONFIG_PCI_DEBUG is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +CONFIG_HZ=100 +# CONFIG_AEABI is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="root=1f03 mem=32M" +# CONFIG_XIP_KERNEL is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_PM_LEGACY is not set +# CONFIG_PM_DEBUG is not set +# CONFIG_PM_SYSFS_DEPRECATED is not set +# CONFIG_APM is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_IPV6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +# CONFIG_FW_LOADER is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_GEOMETRY is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_OTP is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_ARM_INTEGRATOR=y +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SX8 is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# ATA/ATAPI/MFM/RLL support +# +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +# CONFIG_SCSI is not set +# CONFIG_SCSI_NETLINK is not set + +# +# Serial ATA (prod) and Parallel ATA (experimental) drivers +# +# CONFIG_ATA is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NET_VENDOR_3COM is not set +CONFIG_SMC91X=y +# CONFIG_DM9000 is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_HP100 is not set +# CONFIG_NET_PCI is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set +# CONFIG_SKY2 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set +# CONFIG_QLA3XXX is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_CHELSIO_T1 is not set +# CONFIG_IXGB is not set +# CONFIG_S2IO is not set +# CONFIG_MYRI10GE is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PCI=m +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=m +# CONFIG_SERIAL_JSM is not set +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_IXP4XX=y +# CONFIG_NVRAM is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_DRM is not set +# CONFIG_RAW_DRIVER is not set + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALGOPCA is not set + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_IOP3XX is not set +# CONFIG_I2C_IXP4XX is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_PROSAVAGE is not set +# CONFIG_I2C_SAVAGE4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set +# CONFIG_I2C_VOODOO3 is not set +# CONFIG_I2C_PCA_ISA is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +CONFIG_SENSORS_EEPROM=m +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +# CONFIG_HWMON is not set +# CONFIG_HWMON_VID is not set + +# +# Misc devices +# +# CONFIG_SGI_IOC4 is not set +# CONFIG_TIFM_CORE is not set + +# +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +CONFIG_FIRMWARE_EDID=y +CONFIG_FB=y +# CONFIG_FB_DDC is not set +# CONFIG_FB_CFB_FILLRECT is not set +# CONFIG_FB_CFB_COPYAREA is not set +# CONFIG_FB_CFB_IMAGEBLIT is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +# CONFIG_VGACON_SOFT_SCROLLBACK is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +# CONFIG_FONT_8x16 is not set +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +CONFIG_FONT_ACORN_8x8=y +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_10x18 is not set + +# +# Logo configuration +# +# CONFIG_LOGO is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +# CONFIG_SND_AD1889 is not set +# CONFIG_SND_ALS300 is not set +# CONFIG_SND_ALI5451 is not set +# CONFIG_SND_ATIIXP is not set +# CONFIG_SND_ATIIXP_MODEM is not set +# CONFIG_SND_AU8810 is not set +# CONFIG_SND_AU8820 is not set +# CONFIG_SND_AU8830 is not set +# CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BT87X is not set +# CONFIG_SND_CA0106 is not set +# CONFIG_SND_CMIPCI is not set +# CONFIG_SND_CS4281 is not set +# CONFIG_SND_CS46XX is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_EMU10K1X is not set +# CONFIG_SND_ENS1370 is not set +# CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set +# CONFIG_SND_FM801 is not set +# CONFIG_SND_HDA_INTEL is not set +# CONFIG_SND_HDSP is not set +# CONFIG_SND_HDSPM is not set +# CONFIG_SND_ICE1712 is not set +# CONFIG_SND_ICE1724 is not set +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +# CONFIG_SND_KORG1212 is not set +# CONFIG_SND_MAESTRO3 is not set +# CONFIG_SND_MIXART is not set +# CONFIG_SND_NM256 is not set +# CONFIG_SND_PCXHR is not set +# CONFIG_SND_RME32 is not set +# CONFIG_SND_RME96 is not set +# CONFIG_SND_RME9652 is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_TRIDENT is not set +# CONFIG_SND_VIA82XX is not set +# CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VX222 is not set +# CONFIG_SND_YMFPCI is not set + +# +# ALSA ARM devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +# CONFIG_USB is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=y +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_TIFM_SD is not set + +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +# CONFIG_RTC_CLASS is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4DEV_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_MINIX_FS=y +CONFIG_ROMFS_FS=y +# CONFIG_INOTIFY is not set +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +# CONFIG_TMPFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V3_ACL is not set +# CONFIG_NFSD_V4 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=m +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=m +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Profiling support +# +# CONFIG_PROFILING is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +CONFIG_FRAME_POINTER=y +CONFIG_FORCED_INLINING=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_WAITQ is not set +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y diff --git a/samples/armeb-unknown-linux-uclibc/crosstool.config b/samples/armeb-unknown-linux-uclibc/crosstool.config new file mode 100644 index 0000000..dfc8c0d --- /dev/null +++ b/samples/armeb-unknown-linux-uclibc/crosstool.config @@ -0,0 +1,390 @@ +# +# Automatically generated make config: don't edit +# crosstool-NG version: 0.0.1 +# Sat Feb 17 15:37:13 2007 +# + +# +# Paths and misc options +# +CT_PARALLEL_JOBS=1 +CT_LOAD=0 +CT_NICE=5 +CT_USE_PIPES=y + +# +# Paths +# +CT_TARBALLS_DIR="${HOME}/dev/src" +CT_SRC_DIR="${HOME}/x-tools/src/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" +CT_BUILD_DIR="${HOME}/x-tools/build/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" +CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}" +CT_INSTALL_DIR="${CT_PREFIX_DIR}" + +# +# Downloading and extracting +# +# CT_NO_DOWNLOAD is not set +# CT_ONLY_DOWNLOAD is not set +# CT_FORCE_DOWNLOAD is not set +# CT_FORCE_EXTRACT is not set + +# +# Logging +# +# CT_LOG_ERROR is not set +# CT_LOG_WARN is not set +# CT_LOG_INFO is not set +CT_LOG_EXTRA=y +# CT_LOG_DEBUG is not set +CT_LOG_LEVEL_MAX="EXTRA" +# CT_LOG_PROGRESS_BAR is not set +# CT_LOG_USE_COLORS is not set +CT_LOG_TO_FILE=y +CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log" + +# +# Target options +# + +# +# General target options +# +CT_ARCH_ARM=y +# CT_ARCH_MIPS is not set +# CT_ARCH_x86 is not set +# CT_ARCH_x86_64 is not set +CT_ARCH_BE=y +# CT_ARCH_LE is not set + +# +# Target optimisations +# +CT_ARCH_CPU="xscale" +CT_ARCH_TUNE="xscale" +CT_ARCH_ARCH="armv5te" +CT_ARCH_FPU="" +# CT_ARCH_FLOAT_HW is not set +CT_ARCH_FLOAT_SW=y +CT_TARGET_CFLAGS="" + +# +# Toolchain options +# +CT_USE_SYSROOT=y +CT_SHARED_LIBS=y +CT_TARGET_VENDOR="unknown" +CT_TARGET_ALIAS="" +CT_ARCH="arm" +CT_BUILD="" +CT_CC_NATIVE="gcc" +# CT_CANADIAN is not set +CT_HOST="" +CT_HOST_CC="" + +# +# Kernel +# +CT_KERNEL_LINUX=y +# CT_KERNEL_CYGWIN is not set +CT_KERNEL_VERSION="2.6.19.2" +CT_KERNEL_LINUX_HEADERS_INSTALL=y +# CT_KERNEL_LINUX_HEADERS_SANITISED is not set +# CT_KERNEL_LINUX_HEADERS_COPY is not set +CT_KERNEL="linux" +CT_KERNEL_VERSION_SEE_EXTRAVERSION=y +# CT_KERNEL_INSTALL_V_2_6_18 is not set +# CT_KERNEL_INSTALL_V_2_6_18_1 is not set +# CT_KERNEL_INSTALL_V_2_6_18_2 is not set +# CT_KERNEL_INSTALL_V_2_6_18_3 is not set +# CT_KERNEL_INSTALL_V_2_6_18_4 is not set +# CT_KERNEL_INSTALL_V_2_6_18_5 is not set +# CT_KERNEL_INSTALL_V_2_6_18_6 is not set +# CT_KERNEL_INSTALL_V_2_6_19 is not set +# CT_KERNEL_INSTALL_V_2_6_19_1 is not set +CT_KERNEL_INSTALL_V_2_6_19_2=y +# CT_KERNEL_INSTALL_V_2_6_20 is not set +# CT_KERNEL_COPY_V_2_6_0 is not set +# CT_KERNEL_COPY_V_2_6_1 is not set +# CT_KERNEL_COPY_V_2_6_2 is not set +# CT_KERNEL_COPY_V_2_6_3 is not set +# CT_KERNEL_COPY_V_2_6_4 is not set +# CT_KERNEL_COPY_V_2_6_5 is not set +# CT_KERNEL_COPY_V_2_6_6 is not set +# CT_KERNEL_COPY_V_2_6_7 is not set +# CT_KERNEL_COPY_V_2_6_8 is not set +# CT_KERNEL_COPY_V_2_6_8_1 is not set +# CT_KERNEL_COPY_V_2_6_9 is not set +# CT_KERNEL_COPY_V_2_6_10 is not set +# CT_KERNEL_COPY_V_2_6_11 is not set +# CT_KERNEL_COPY_V_2_6_11_1 is not set +# CT_KERNEL_COPY_V_2_6_11_10 is not set +# CT_KERNEL_COPY_V_2_6_11_11 is not set +# CT_KERNEL_COPY_V_2_6_11_12 is not set +# CT_KERNEL_COPY_V_2_6_11_2 is not set +# CT_KERNEL_COPY_V_2_6_11_3 is not set +# CT_KERNEL_COPY_V_2_6_11_4 is not set +# CT_KERNEL_COPY_V_2_6_11_5 is not set +# CT_KERNEL_COPY_V_2_6_11_6 is not set +# CT_KERNEL_COPY_V_2_6_11_7 is not set +# CT_KERNEL_COPY_V_2_6_11_8 is not set +# CT_KERNEL_COPY_V_2_6_11_9 is not set +# CT_KERNEL_COPY_V_2_6_12 is not set +# CT_KERNEL_COPY_V_2_6_12_1 is not set +# CT_KERNEL_COPY_V_2_6_12_2 is not set +# CT_KERNEL_COPY_V_2_6_12_3 is not set +# CT_KERNEL_COPY_V_2_6_12_4 is not set +# CT_KERNEL_COPY_V_2_6_12_5 is not set +# CT_KERNEL_COPY_V_2_6_12_6 is not set +# CT_KERNEL_COPY_V_2_6_13 is not set +# CT_KERNEL_COPY_V_2_6_13_1 is not set +# CT_KERNEL_COPY_V_2_6_13_2 is not set +# CT_KERNEL_COPY_V_2_6_13_3 is not set +# CT_KERNEL_COPY_V_2_6_13_4 is not set +# CT_KERNEL_COPY_V_2_6_13_5 is not set +# CT_KERNEL_COPY_V_2_6_14 is not set +# CT_KERNEL_COPY_V_2_6_14_1 is not set +# CT_KERNEL_COPY_V_2_6_14_2 is not set +# CT_KERNEL_COPY_V_2_6_14_3 is not set +# CT_KERNEL_COPY_V_2_6_14_4 is not set +# CT_KERNEL_COPY_V_2_6_14_5 is not set +# CT_KERNEL_COPY_V_2_6_14_6 is not set +# CT_KERNEL_COPY_V_2_6_14_7 is not set +# CT_KERNEL_COPY_V_2_6_15 is not set +# CT_KERNEL_COPY_V_2_6_15_1 is not set +# CT_KERNEL_COPY_V_2_6_15_2 is not set +# CT_KERNEL_COPY_V_2_6_15_3 is not set +# CT_KERNEL_COPY_V_2_6_15_4 is not set +# CT_KERNEL_COPY_V_2_6_15_5 is not set +# CT_KERNEL_COPY_V_2_6_15_6 is not set +# CT_KERNEL_COPY_V_2_6_15_7 is not set +# CT_KERNEL_COPY_V_2_6_16 is not set +# CT_KERNEL_COPY_V_2_6_16_1 is not set +# CT_KERNEL_COPY_V_2_6_16_10 is not set +# CT_KERNEL_COPY_V_2_6_16_11 is not set +# CT_KERNEL_COPY_V_2_6_16_12 is not set +# CT_KERNEL_COPY_V_2_6_16_13 is not set +# CT_KERNEL_COPY_V_2_6_16_14 is not set +# CT_KERNEL_COPY_V_2_6_16_15 is not set +# CT_KERNEL_COPY_V_2_6_16_16 is not set +# CT_KERNEL_COPY_V_2_6_16_17 is not set +# CT_KERNEL_COPY_V_2_6_16_18 is not set +# CT_KERNEL_COPY_V_2_6_16_19 is not set +# CT_KERNEL_COPY_V_2_6_16_2 is not set +# CT_KERNEL_COPY_V_2_6_16_20 is not set +# CT_KERNEL_COPY_V_2_6_16_21 is not set +# CT_KERNEL_COPY_V_2_6_16_22 is not set +# CT_KERNEL_COPY_V_2_6_16_23 is not set +# CT_KERNEL_COPY_V_2_6_16_24 is not set +# CT_KERNEL_COPY_V_2_6_16_25 is not set +# CT_KERNEL_COPY_V_2_6_16_26 is not set +# CT_KERNEL_COPY_V_2_6_16_27 is not set +# CT_KERNEL_COPY_V_2_6_16_28 is not set +# CT_KERNEL_COPY_V_2_6_16_29 is not set +# CT_KERNEL_COPY_V_2_6_16_3 is not set +# CT_KERNEL_COPY_V_2_6_16_30 is not set +# CT_KERNEL_COPY_V_2_6_16_31 is not set +# CT_KERNEL_COPY_V_2_6_16_32 is not set +# CT_KERNEL_COPY_V_2_6_16_33 is not set +# CT_KERNEL_COPY_V_2_6_16_34 is not set +# CT_KERNEL_COPY_V_2_6_16_35 is not set +# CT_KERNEL_COPY_V_2_6_16_36 is not set +# CT_KERNEL_COPY_V_2_6_16_4 is not set +# CT_KERNEL_COPY_V_2_6_16_5 is not set +# CT_KERNEL_COPY_V_2_6_16_6 is not set +# CT_KERNEL_COPY_V_2_6_16_7 is not set +# CT_KERNEL_COPY_V_2_6_16_8 is not set +# CT_KERNEL_COPY_V_2_6_16_9 is not set +# CT_KERNEL_COPY_V_2_6_17 is not set +# CT_KERNEL_COPY_V_2_6_17_1 is not set +# CT_KERNEL_COPY_V_2_6_17_10 is not set +# CT_KERNEL_COPY_V_2_6_17_11 is not set +# CT_KERNEL_COPY_V_2_6_17_12 is not set +# CT_KERNEL_COPY_V_2_6_17_13 is not set +# CT_KERNEL_COPY_V_2_6_17_14 is not set +# CT_KERNEL_COPY_V_2_6_17_2 is not set +# CT_KERNEL_COPY_V_2_6_17_3 is not set +# CT_KERNEL_COPY_V_2_6_17_4 is not set +# CT_KERNEL_COPY_V_2_6_17_5 is not set +# CT_KERNEL_COPY_V_2_6_17_6 is not set +# CT_KERNEL_COPY_V_2_6_17_7 is not set +# CT_KERNEL_COPY_V_2_6_17_8 is not set +# CT_KERNEL_COPY_V_2_6_17_9 is not set +# CT_KERNEL_COPY_V_2_6_18 is not set +# CT_KERNEL_COPY_V_2_6_18_1 is not set +# CT_KERNEL_COPY_V_2_6_18_2 is not set +# CT_KERNEL_COPY_V_2_6_18_3 is not set +# CT_KERNEL_COPY_V_2_6_18_4 is not set +# CT_KERNEL_COPY_V_2_6_18_5 is not set +# CT_KERNEL_COPY_V_2_6_18_6 is not set +# CT_KERNEL_COPY_V_2_6_19 is not set +# CT_KERNEL_COPY_V_2_6_19_1 is not set +# CT_KERNEL_SANITISED_V_2_6_7_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_1 is not set +# CT_KERNEL_SANITISED_V_2_6_9_0 is not set +# CT_KERNEL_SANITISED_V_2_6_9_1 is not set +# CT_KERNEL_SANITISED_V_2_6_10_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_1 is not set +# CT_KERNEL_SANITISED_V_2_6_11_2 is not set +# CT_KERNEL_SANITISED_V_2_6_12_0 is not set +CT_KERNEL_LINUX_VERBOSITY_0=y +# CT_KERNEL_LINUX_VERBOSITY_1 is not set +# CT_KERNEL_LINUX_VERBOSITY_2 is not set +CT_KERNEL_LINUX_VERBOSE_LEVEL=0 +CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config" + +# +# binutils +# +CT_BINUTILS_VERSION="2.17.50.0.10" +# CT_BINUTILS_V_2_11_2 is not set +# CT_BINUTILS_V_2_13_90 is not set +# CT_BINUTILS_V_2_14 is not set +# CT_BINUTILS_V_2_14_90 is not set +# CT_BINUTILS_V_2_14_92 is not set +# CT_BINUTILS_V_2_15 is not set +# CT_BINUTILS_V_2_15_90 is not set +# CT_BINUTILS_V_2_15_91 is not set +# CT_BINUTILS_V_2_16 is not set +# CT_BINUTILS_V_2_16_1 is not set +# CT_BINUTILS_V_2_17 is not set +# CT_BINUTILS_V_2_17_50_0_1 is not set +# CT_BINUTILS_V_2_17_50_0_2 is not set +# CT_BINUTILS_V_2_17_50_0_3 is not set +# CT_BINUTILS_V_2_17_50_0_4 is not set +# CT_BINUTILS_V_2_17_50_0_5 is not set +# CT_BINUTILS_V_2_17_50_0_6 is not set +# CT_BINUTILS_V_2_17_50_0_7 is not set +# CT_BINUTILS_V_2_17_50_0_8 is not set +# CT_BINUTILS_V_2_17_50_0_9 is not set +CT_BINUTILS_V_2_17_50_0_10=y +CT_BINUTILS_EXTRA_CONFIG="" + +# +# C compiler +# + +# +# Core C Compiler (used to build the C library) +# +# CT_CC_USE_CORE is not set +CT_CC_CORE_GCC=y +# CT_CC_CORE_TCC is not set +CT_CC_CORE_VERSION="" +CT_CC_CORE="gcc" +# CT_CC_CORE_V_2_95_3 is not set +# CT_CC_CORE_V_3_2_3 is not set +# CT_CC_CORE_V_3_3 is not set +# CT_CC_CORE_V_3_3_1 is not set +# CT_CC_CORE_V_3_3_2 is not set +# CT_CC_CORE_V_3_3_3 is not set +# CT_CC_CORE_V_3_3_4 is not set +# CT_CC_CORE_V_3_3_5 is not set +# CT_CC_CORE_V_3_3_6 is not set +# CT_CC_CORE_V_3_4_0 is not set +# CT_CC_CORE_V_3_4_1 is not set +# CT_CC_CORE_V_3_4_2 is not set +# CT_CC_CORE_V_3_4_3 is not set +# CT_CC_CORE_V_3_4_4 is not set +# CT_CC_CORE_V_3_4_5 is not set +# CT_CC_CORE_V_3_4_6 is not set +# CT_CC_CORE_V_4_0_0 is not set +# CT_CC_CORE_V_4_0_1 is not set +# CT_CC_CORE_V_4_0_2 is not set +# CT_CC_CORE_V_4_0_3 is not set +# CT_CC_CORE_V_4_0_4 is not set +# CT_CC_CORE_V_4_1_0 is not set +# CT_CC_CORE_V_4_1_1 is not set +CT_CC_CORE_EXTRA_CONFIG="" + +# +# Final C compiler +# +CT_CC_GCC=y +CT_CC_VERSION="4.0.4" +CT_CC="gcc" +# CT_CC_V_2_95_3 is not set +# CT_CC_V_3_2_3 is not set +# CT_CC_V_3_3 is not set +# CT_CC_V_3_3_1 is not set +# CT_CC_V_3_3_2 is not set +# CT_CC_V_3_3_3 is not set +# CT_CC_V_3_3_4 is not set +# CT_CC_V_3_3_5 is not set +# CT_CC_V_3_3_6 is not set +# CT_CC_V_3_4_0 is not set +# CT_CC_V_3_4_1 is not set +# CT_CC_V_3_4_2 is not set +# CT_CC_V_3_4_3 is not set +# CT_CC_V_3_4_4 is not set +# CT_CC_V_3_4_5 is not set +# CT_CC_V_4_0_0 is not set +# CT_CC_V_4_0_1 is not set +# CT_CC_V_4_0_2 is not set +# CT_CC_V_4_0_3 is not set +CT_CC_V_4_0_4=y +# CT_CC_V_4_1_0 is not set +# CT_CC_V_4_1_1 is not set +CT_CC_EXTRA_CONFIG="" +CT_CC_SUPPORT_C=y +CT_CC_SUPPORT_CXX=y +CT_CC_SUPPORT_JAVA=y + +# +# Supported languages: +# +CT_CC_LANG_C=y +CT_CC_LANG_CXX=y +# CT_CC_LANG_JAVA is not set + +# +# C-library +# +# CT_LIBC_GLIBC is not set +CT_LIBC_UCLIBC=y +CT_LIBC_VERSION="0.9.28.1" +CT_LIBC="uClibc" +# CT_LIBC_V_1_09_1 is not set +# CT_LIBC_V_2_0_1 is not set +# CT_LIBC_V_2_0_6 is not set +# CT_LIBC_V_2_1_1 is not set +# CT_LIBC_V_2_1_2 is not set +# CT_LIBC_V_2_1_3 is not set +# CT_LIBC_V_2_2 is not set +# CT_LIBC_V_2_2_1 is not set +# CT_LIBC_V_2_2_2 is not set +# CT_LIBC_V_2_2_3 is not set +# CT_LIBC_V_2_2_4 is not set +# CT_LIBC_V_2_2_5 is not set +# CT_LIBC_V_2_3 is not set +# CT_LIBC_V_2_3_1 is not set +# CT_LIBC_V_2_3_2 is not set +# CT_LIBC_V_2_3_3 is not set +# CT_LIBC_V_2_3_4 is not set +# CT_LIBC_V_2_3_5 is not set +# CT_LIBC_V_2_3_6 is not set +# CT_LIBC_V_2_4 is not set +# CT_LIBC_V_2_5 is not set +# CT_LIBC_GLIBC_THREADS_NPTL is not set +# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set +# CT_LIBC_GLIBC_THREADS_NONE is not set +CT_LIBC_GLIBC_EXTRA_CONFIG="" +CT_LIBC_GLIBC_EXTRA_CFLAGS="" +CT_LIBC_EXTRA_CC_ARGS="" +CT_LIBC_GLIBC_CONFIGPARMS="" +# CT_LIBC_ADDONS is not set +CT_LIBC_ADDONS_LIST="" +# CT_LIBC_V_snapshot is not set +# CT_LIBC_V_specific_date is not set +# CT_LIBC_V_0_9_26 is not set +# CT_LIBC_V_0_9_27 is not set +# CT_LIBC_V_0_9_28 is not set +CT_LIBC_V_0_9_28_1=y +CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y +# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set +# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set +CT_LIBC_UCLIBC_DEBUG_LEVEL=0 +CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config" +# CT_LIBC_UCLIBC_LOCALES is not set diff --git a/samples/armeb-unknown-linux-uclibc/linux-2.6.19.2.config b/samples/armeb-unknown-linux-uclibc/linux-2.6.19.2.config new file mode 100644 index 0000000..a3c490c --- /dev/null +++ b/samples/armeb-unknown-linux-uclibc/linux-2.6.19.2.config @@ -0,0 +1,1197 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.19.1 +# Sat Dec 23 17:36:49 2006 +# +CONFIG_ARM=y +CONFIG_GENERIC_TIME=y +CONFIG_MMU=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="-nslu2" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_IPC_NS is not set +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_UTS_NS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +# CONFIG_RELAY is not set +CONFIG_INITRAMFS_SOURCE="" +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# +CONFIG_BLOCK=y +# CONFIG_BLK_DEV_IO_TRACE is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +CONFIG_ARCH_IXP4XX=y +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_OMAP is not set +CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y + +# +# Intel IXP4xx Implementation Options +# + +# +# IXP4xx Platforms +# +CONFIG_MACH_NSLU2=y +# CONFIG_ARCH_AVILA is not set +# CONFIG_ARCH_ADI_COYOTE is not set +# CONFIG_ARCH_IXDP425 is not set +# CONFIG_MACH_IXDPG425 is not set +# CONFIG_MACH_IXDP465 is not set +# CONFIG_ARCH_PRPMC1100 is not set +# CONFIG_MACH_NAS100D is not set +# CONFIG_MACH_GTWX5715 is not set + +# +# IXP4xx Options +# +CONFIG_DMABOUNCE=y +# CONFIG_IXP4XX_INDIRECT_PCI is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_XSCALE=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5T=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +CONFIG_ARM_THUMB=y +CONFIG_CPU_BIG_ENDIAN=y +# CONFIG_CPU_DCACHE_DISABLE is not set +CONFIG_XSCALE_PMU=y + +# +# Bus support +# +CONFIG_PCI=y +# CONFIG_PCI_DEBUG is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +CONFIG_HZ=100 +# CONFIG_AEABI is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="root=1f03 mem=32M" +# CONFIG_XIP_KERNEL is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_PM_LEGACY is not set +# CONFIG_PM_DEBUG is not set +# CONFIG_PM_SYSFS_DEPRECATED is not set +# CONFIG_APM is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_IPV6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +# CONFIG_FW_LOADER is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_GEOMETRY is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_OTP is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_ARM_INTEGRATOR=y +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SX8 is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# ATA/ATAPI/MFM/RLL support +# +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +# CONFIG_SCSI is not set +# CONFIG_SCSI_NETLINK is not set + +# +# Serial ATA (prod) and Parallel ATA (experimental) drivers +# +# CONFIG_ATA is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NET_VENDOR_3COM is not set +CONFIG_SMC91X=y +# CONFIG_DM9000 is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_HP100 is not set +# CONFIG_NET_PCI is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set +# CONFIG_SKY2 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set +# CONFIG_QLA3XXX is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_CHELSIO_T1 is not set +# CONFIG_IXGB is not set +# CONFIG_S2IO is not set +# CONFIG_MYRI10GE is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PCI=m +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=m +# CONFIG_SERIAL_JSM is not set +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_IXP4XX=y +# CONFIG_NVRAM is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_DRM is not set +# CONFIG_RAW_DRIVER is not set + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALGOPCA is not set + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_IOP3XX is not set +# CONFIG_I2C_IXP4XX is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_PROSAVAGE is not set +# CONFIG_I2C_SAVAGE4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set +# CONFIG_I2C_VOODOO3 is not set +# CONFIG_I2C_PCA_ISA is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +CONFIG_SENSORS_EEPROM=m +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +# CONFIG_HWMON is not set +# CONFIG_HWMON_VID is not set + +# +# Misc devices +# +# CONFIG_SGI_IOC4 is not set +# CONFIG_TIFM_CORE is not set + +# +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +CONFIG_FIRMWARE_EDID=y +CONFIG_FB=y +# CONFIG_FB_DDC is not set +# CONFIG_FB_CFB_FILLRECT is not set +# CONFIG_FB_CFB_COPYAREA is not set +# CONFIG_FB_CFB_IMAGEBLIT is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +# CONFIG_VGACON_SOFT_SCROLLBACK is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +# CONFIG_FONT_8x16 is not set +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +CONFIG_FONT_ACORN_8x8=y +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_10x18 is not set + +# +# Logo configuration +# +# CONFIG_LOGO is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +# CONFIG_SND_AD1889 is not set +# CONFIG_SND_ALS300 is not set +# CONFIG_SND_ALI5451 is not set +# CONFIG_SND_ATIIXP is not set +# CONFIG_SND_ATIIXP_MODEM is not set +# CONFIG_SND_AU8810 is not set +# CONFIG_SND_AU8820 is not set +# CONFIG_SND_AU8830 is not set +# CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BT87X is not set +# CONFIG_SND_CA0106 is not set +# CONFIG_SND_CMIPCI is not set +# CONFIG_SND_CS4281 is not set +# CONFIG_SND_CS46XX is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_EMU10K1X is not set +# CONFIG_SND_ENS1370 is not set +# CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set +# CONFIG_SND_FM801 is not set +# CONFIG_SND_HDA_INTEL is not set +# CONFIG_SND_HDSP is not set +# CONFIG_SND_HDSPM is not set +# CONFIG_SND_ICE1712 is not set +# CONFIG_SND_ICE1724 is not set +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +# CONFIG_SND_KORG1212 is not set +# CONFIG_SND_MAESTRO3 is not set +# CONFIG_SND_MIXART is not set +# CONFIG_SND_NM256 is not set +# CONFIG_SND_PCXHR is not set +# CONFIG_SND_RME32 is not set +# CONFIG_SND_RME96 is not set +# CONFIG_SND_RME9652 is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_TRIDENT is not set +# CONFIG_SND_VIA82XX is not set +# CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VX222 is not set +# CONFIG_SND_YMFPCI is not set + +# +# ALSA ARM devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +# CONFIG_USB is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=y +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_TIFM_SD is not set + +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +# CONFIG_RTC_CLASS is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4DEV_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_MINIX_FS=y +CONFIG_ROMFS_FS=y +# CONFIG_INOTIFY is not set +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +# CONFIG_TMPFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V3_ACL is not set +# CONFIG_NFSD_V4 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=m +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=m +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Profiling support +# +# CONFIG_PROFILING is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +CONFIG_FRAME_POINTER=y +CONFIG_FORCED_INLINING=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_WAITQ is not set +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y diff --git a/samples/armeb-unknown-linux-uclibc/uClibc-0.9.28.2.config b/samples/armeb-unknown-linux-uclibc/uClibc-0.9.28.2.config new file mode 100644 index 0000000..92c4faf --- /dev/null +++ b/samples/armeb-unknown-linux-uclibc/uClibc-0.9.28.2.config @@ -0,0 +1,169 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +TARGET_arm=y +# TARGET_bfin is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +# TARGET_mips is not set +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sh64 is not set +# TARGET_sparc is not set +# TARGET_v850 is not set +# TARGET_x86_64 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="arm" +ARCH_SUPPORTS_BIG_ENDIAN=y +# CONFIG_GENERIC_ARM is not set +# CONFIG_ARM610 is not set +# CONFIG_ARM710 is not set +# CONFIG_ARM720T is not set +# CONFIG_ARM920T is not set +# CONFIG_ARM922T is not set +# CONFIG_ARM926T is not set +# CONFIG_ARM1136JF_S is not set +# CONFIG_ARM_SA110 is not set +# CONFIG_ARM_SA1100 is not set +CONFIG_ARM_XSCALE=y +# ARCH_LITTLE_ENDIAN is not set +ARCH_BIG_ENDIAN=y +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +# HAS_FPU is not set +UCLIBC_HAS_SOFT_FLOAT=y +DO_C99_MATH=y +KERNEL_SOURCE="/usr/src/linux" +C_SYMBOL_PREFIX="" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +LDSO_CACHE_SUPPORT=y +# LDSO_PRELOAD_FILE_SUPPORT is not set +LDSO_BASE_FILENAME="ld.so" +# LDSO_RUNPATH is not set +# DL_FINI_CRT_COMPAT is not set +UCLIBC_CTOR_DTOR=y +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +# PTHREADS_DEBUG_SUPPORT is not set +UCLIBC_HAS_LFS=y +UCLIBC_STATIC_LDCONFIG=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +# MALLOC_GLIBC_COMPAT is not set +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +UNIX98PTY_ONLY=y +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +# UCLIBC_HAS_TZ_CACHING is not set +UCLIBC_HAS_TZ_FILE=y +# UCLIBC_HAS_TZ_FILE_READ_MANY is not set +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +# UCLIBC_HAS_IPV6 is not set +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_STRING_GENERIC_OPT=y +UCLIBC_HAS_STRING_ARCH_OPT=y +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +# UCLIBC_HAS_CTYPE_CHECKED is not set +UCLIBC_HAS_CTYPE_ENFORCED=y +# UCLIBC_HAS_WCHAR is not set +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +# UCLIBC_HAS_GLIBC_CUSTOM_PRINTF is not set +# USE_OLD_VFPRINTF is not set +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT=y +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +UCLIBC_HAS_FOPEN_LARGEFILE_MODE=y +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +UCLIBC_HAS_WORDEXP=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="$(RUNTIME_PREFIX)lib" +RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/" +DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/" + +# +# uClibc security related options +# +# UCLIBC_SECURITY is not set + +# +# uClibc development/debugging options +# +CROSS_COMPILER_PREFIX="" +# DODEBUG is not set +# DODEBUG_PT is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +WARNINGS="-Wall" +# UCLIBC_MJN3_ONLY is not set diff --git a/samples/i586-geode-linux-uclibc/crosstool.config b/samples/i586-geode-linux-uclibc/crosstool.config new file mode 100644 index 0000000..dac5019 --- /dev/null +++ b/samples/i586-geode-linux-uclibc/crosstool.config @@ -0,0 +1,386 @@ +# +# Automatically generated make config: don't edit +# crosstool-NG version: 0.0.1 +# Sat Feb 3 14:14:42 2007 +# + +# +# Paths and misc options +# +CT_PARALLEL_JOBS=1 +CT_LOAD=0 +CT_NICE=5 +CT_USE_PIPES=y + +# +# Paths +# +CT_TARBALLS_DIR="${HOME}/dev/src" +CT_SRC_DIR="${HOME}/x-tools/src/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" +CT_BUILD_DIR="${HOME}/x-tools/build/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" +CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}" +CT_INSTALL_DIR="${CT_PREFIX_DIR}" + +# +# Downloading and extracting +# +# CT_NO_DOWNLOAD is not set +# CT_ONLY_DOWNLOAD is not set +# CT_FORCE_DOWNLOAD is not set +# CT_FORCE_EXTRACT is not set + +# +# Logging +# +# CT_LOG_ERROR is not set +# CT_LOG_WARN is not set +# CT_LOG_INFO is not set +CT_LOG_EXTRA=y +# CT_LOG_DEBUG is not set +CT_LOG_LEVEL_MAX="EXTRA" +# CT_LOG_PROGRESS_BAR is not set +# CT_LOG_USE_COLORS is not set +CT_LOG_TO_FILE=y +CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log" + +# +# Target options +# + +# +# General target options +# +# CT_ARCH_ARM is not set +# CT_ARCH_MIPS is not set +CT_ARCH_x86=y +# CT_ARCH_x86_64 is not set +# CT_ARCH_BE is not set +CT_ARCH_LE=y +CT_ARCH_FLOAT_HW=y +# CT_ARCH_FLOAT_SW is not set + +# +# Target optimisations +# +CT_ARCH_CPU="" +CT_ARCH_TUNE="" +CT_ARCH_ARCH="pentium-mmx" +CT_TARGET_CFLAGS="" + +# +# Toolchain options +# +CT_USE_SYSROOT=y +CT_SHARED_LIBS=y +CT_TARGET_VENDOR="geode" +CT_ARCH="x86" +CT_BUILD="" +CT_CC_NATIVE="gcc" +# CT_CANADIAN is not set +CT_HOST="" +CT_HOST_CC="" + +# +# Kernel +# +CT_KERNEL_LINUX=y +# CT_KERNEL_CYGWIN is not set +CT_KERNEL_VERSION="2.6.19.2" +CT_KERNEL_LINUX_HEADERS_INSTALL=y +# CT_KERNEL_LINUX_HEADERS_SANITISED is not set +# CT_KERNEL_LINUX_HEADERS_COPY is not set +CT_KERNEL="linux" +CT_KERNEL_VERSION_SEE_EXTRAVERSION=y +# CT_KERNEL_INSTALL_V_2_6_18 is not set +# CT_KERNEL_INSTALL_V_2_6_18_1 is not set +# CT_KERNEL_INSTALL_V_2_6_18_2 is not set +# CT_KERNEL_INSTALL_V_2_6_18_3 is not set +# CT_KERNEL_INSTALL_V_2_6_18_4 is not set +# CT_KERNEL_INSTALL_V_2_6_18_5 is not set +# CT_KERNEL_INSTALL_V_2_6_18_6 is not set +# CT_KERNEL_INSTALL_V_2_6_19 is not set +# CT_KERNEL_INSTALL_V_2_6_19_1 is not set +CT_KERNEL_INSTALL_V_2_6_19_2=y +# CT_KERNEL_COPY_V_2_6_0 is not set +# CT_KERNEL_COPY_V_2_6_1 is not set +# CT_KERNEL_COPY_V_2_6_2 is not set +# CT_KERNEL_COPY_V_2_6_3 is not set +# CT_KERNEL_COPY_V_2_6_4 is not set +# CT_KERNEL_COPY_V_2_6_5 is not set +# CT_KERNEL_COPY_V_2_6_6 is not set +# CT_KERNEL_COPY_V_2_6_7 is not set +# CT_KERNEL_COPY_V_2_6_8 is not set +# CT_KERNEL_COPY_V_2_6_8_1 is not set +# CT_KERNEL_COPY_V_2_6_9 is not set +# CT_KERNEL_COPY_V_2_6_10 is not set +# CT_KERNEL_COPY_V_2_6_11 is not set +# CT_KERNEL_COPY_V_2_6_11_1 is not set +# CT_KERNEL_COPY_V_2_6_11_10 is not set +# CT_KERNEL_COPY_V_2_6_11_11 is not set +# CT_KERNEL_COPY_V_2_6_11_12 is not set +# CT_KERNEL_COPY_V_2_6_11_2 is not set +# CT_KERNEL_COPY_V_2_6_11_3 is not set +# CT_KERNEL_COPY_V_2_6_11_4 is not set +# CT_KERNEL_COPY_V_2_6_11_5 is not set +# CT_KERNEL_COPY_V_2_6_11_6 is not set +# CT_KERNEL_COPY_V_2_6_11_7 is not set +# CT_KERNEL_COPY_V_2_6_11_8 is not set +# CT_KERNEL_COPY_V_2_6_11_9 is not set +# CT_KERNEL_COPY_V_2_6_12 is not set +# CT_KERNEL_COPY_V_2_6_12_1 is not set +# CT_KERNEL_COPY_V_2_6_12_2 is not set +# CT_KERNEL_COPY_V_2_6_12_3 is not set +# CT_KERNEL_COPY_V_2_6_12_4 is not set +# CT_KERNEL_COPY_V_2_6_12_5 is not set +# CT_KERNEL_COPY_V_2_6_12_6 is not set +# CT_KERNEL_COPY_V_2_6_13 is not set +# CT_KERNEL_COPY_V_2_6_13_1 is not set +# CT_KERNEL_COPY_V_2_6_13_2 is not set +# CT_KERNEL_COPY_V_2_6_13_3 is not set +# CT_KERNEL_COPY_V_2_6_13_4 is not set +# CT_KERNEL_COPY_V_2_6_13_5 is not set +# CT_KERNEL_COPY_V_2_6_14 is not set +# CT_KERNEL_COPY_V_2_6_14_1 is not set +# CT_KERNEL_COPY_V_2_6_14_2 is not set +# CT_KERNEL_COPY_V_2_6_14_3 is not set +# CT_KERNEL_COPY_V_2_6_14_4 is not set +# CT_KERNEL_COPY_V_2_6_14_5 is not set +# CT_KERNEL_COPY_V_2_6_14_6 is not set +# CT_KERNEL_COPY_V_2_6_14_7 is not set +# CT_KERNEL_COPY_V_2_6_15 is not set +# CT_KERNEL_COPY_V_2_6_15_1 is not set +# CT_KERNEL_COPY_V_2_6_15_2 is not set +# CT_KERNEL_COPY_V_2_6_15_3 is not set +# CT_KERNEL_COPY_V_2_6_15_4 is not set +# CT_KERNEL_COPY_V_2_6_15_5 is not set +# CT_KERNEL_COPY_V_2_6_15_6 is not set +# CT_KERNEL_COPY_V_2_6_15_7 is not set +# CT_KERNEL_COPY_V_2_6_16 is not set +# CT_KERNEL_COPY_V_2_6_16_1 is not set +# CT_KERNEL_COPY_V_2_6_16_10 is not set +# CT_KERNEL_COPY_V_2_6_16_11 is not set +# CT_KERNEL_COPY_V_2_6_16_12 is not set +# CT_KERNEL_COPY_V_2_6_16_13 is not set +# CT_KERNEL_COPY_V_2_6_16_14 is not set +# CT_KERNEL_COPY_V_2_6_16_15 is not set +# CT_KERNEL_COPY_V_2_6_16_16 is not set +# CT_KERNEL_COPY_V_2_6_16_17 is not set +# CT_KERNEL_COPY_V_2_6_16_18 is not set +# CT_KERNEL_COPY_V_2_6_16_19 is not set +# CT_KERNEL_COPY_V_2_6_16_2 is not set +# CT_KERNEL_COPY_V_2_6_16_20 is not set +# CT_KERNEL_COPY_V_2_6_16_21 is not set +# CT_KERNEL_COPY_V_2_6_16_22 is not set +# CT_KERNEL_COPY_V_2_6_16_23 is not set +# CT_KERNEL_COPY_V_2_6_16_24 is not set +# CT_KERNEL_COPY_V_2_6_16_25 is not set +# CT_KERNEL_COPY_V_2_6_16_26 is not set +# CT_KERNEL_COPY_V_2_6_16_27 is not set +# CT_KERNEL_COPY_V_2_6_16_28 is not set +# CT_KERNEL_COPY_V_2_6_16_29 is not set +# CT_KERNEL_COPY_V_2_6_16_3 is not set +# CT_KERNEL_COPY_V_2_6_16_30 is not set +# CT_KERNEL_COPY_V_2_6_16_31 is not set +# CT_KERNEL_COPY_V_2_6_16_32 is not set +# CT_KERNEL_COPY_V_2_6_16_33 is not set +# CT_KERNEL_COPY_V_2_6_16_34 is not set +# CT_KERNEL_COPY_V_2_6_16_35 is not set +# CT_KERNEL_COPY_V_2_6_16_36 is not set +# CT_KERNEL_COPY_V_2_6_16_4 is not set +# CT_KERNEL_COPY_V_2_6_16_5 is not set +# CT_KERNEL_COPY_V_2_6_16_6 is not set +# CT_KERNEL_COPY_V_2_6_16_7 is not set +# CT_KERNEL_COPY_V_2_6_16_8 is not set +# CT_KERNEL_COPY_V_2_6_16_9 is not set +# CT_KERNEL_COPY_V_2_6_17 is not set +# CT_KERNEL_COPY_V_2_6_17_1 is not set +# CT_KERNEL_COPY_V_2_6_17_10 is not set +# CT_KERNEL_COPY_V_2_6_17_11 is not set +# CT_KERNEL_COPY_V_2_6_17_12 is not set +# CT_KERNEL_COPY_V_2_6_17_13 is not set +# CT_KERNEL_COPY_V_2_6_17_14 is not set +# CT_KERNEL_COPY_V_2_6_17_2 is not set +# CT_KERNEL_COPY_V_2_6_17_3 is not set +# CT_KERNEL_COPY_V_2_6_17_4 is not set +# CT_KERNEL_COPY_V_2_6_17_5 is not set +# CT_KERNEL_COPY_V_2_6_17_6 is not set +# CT_KERNEL_COPY_V_2_6_17_7 is not set +# CT_KERNEL_COPY_V_2_6_17_8 is not set +# CT_KERNEL_COPY_V_2_6_17_9 is not set +# CT_KERNEL_COPY_V_2_6_18 is not set +# CT_KERNEL_COPY_V_2_6_18_1 is not set +# CT_KERNEL_COPY_V_2_6_18_2 is not set +# CT_KERNEL_COPY_V_2_6_18_3 is not set +# CT_KERNEL_COPY_V_2_6_18_4 is not set +# CT_KERNEL_COPY_V_2_6_18_5 is not set +# CT_KERNEL_COPY_V_2_6_18_6 is not set +# CT_KERNEL_COPY_V_2_6_19 is not set +# CT_KERNEL_COPY_V_2_6_19_1 is not set +# CT_KERNEL_SANITISED_V_2_6_7_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_0 is not set +# CT_KERNEL_SANITISED_V_2_6_8_1 is not set +# CT_KERNEL_SANITISED_V_2_6_9_0 is not set +# CT_KERNEL_SANITISED_V_2_6_9_1 is not set +# CT_KERNEL_SANITISED_V_2_6_10_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_0 is not set +# CT_KERNEL_SANITISED_V_2_6_11_1 is not set +# CT_KERNEL_SANITISED_V_2_6_11_2 is not set +# CT_KERNEL_SANITISED_V_2_6_12_0 is not set +CT_KERNEL_LINUX_VERBOSITY_0=y +# CT_KERNEL_LINUX_VERBOSITY_1 is not set +# CT_KERNEL_LINUX_VERBOSITY_2 is not set +CT_KERNEL_LINUX_VERBOSE_LEVEL=0 +CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config" + +# +# binutils +# +CT_BINUTILS_VERSION="2.17.50.0.10" +# CT_BINUTILS_V_2_11_2 is not set +# CT_BINUTILS_V_2_13_90 is not set +# CT_BINUTILS_V_2_14 is not set +# CT_BINUTILS_V_2_14_90 is not set +# CT_BINUTILS_V_2_14_92 is not set +# CT_BINUTILS_V_2_15 is not set +# CT_BINUTILS_V_2_15_90 is not set +# CT_BINUTILS_V_2_15_91 is not set +# CT_BINUTILS_V_2_16 is not set +# CT_BINUTILS_V_2_16_1 is not set +# CT_BINUTILS_V_2_17 is not set +# CT_BINUTILS_V_2_17_50_0_1 is not set +# CT_BINUTILS_V_2_17_50_0_2 is not set +# CT_BINUTILS_V_2_17_50_0_3 is not set +# CT_BINUTILS_V_2_17_50_0_4 is not set +# CT_BINUTILS_V_2_17_50_0_5 is not set +# CT_BINUTILS_V_2_17_50_0_6 is not set +# CT_BINUTILS_V_2_17_50_0_7 is not set +# CT_BINUTILS_V_2_17_50_0_8 is not set +# CT_BINUTILS_V_2_17_50_0_9 is not set +CT_BINUTILS_V_2_17_50_0_10=y +CT_BINUTILS_EXTRA_CONFIG="" + +# +# C compiler +# + +# +# Core C Compiler (used to build the C library) +# +# CT_CC_USE_CORE is not set +CT_CC_CORE_GCC=y +# CT_CC_CORE_TCC is not set +CT_CC_CORE_VERSION="" +CT_CC_CORE="gcc" +# CT_CC_CORE_V_2_95_3 is not set +# CT_CC_CORE_V_3_2_3 is not set +# CT_CC_CORE_V_3_3 is not set +# CT_CC_CORE_V_3_3_1 is not set +# CT_CC_CORE_V_3_3_2 is not set +# CT_CC_CORE_V_3_3_3 is not set +# CT_CC_CORE_V_3_3_4 is not set +# CT_CC_CORE_V_3_3_5 is not set +# CT_CC_CORE_V_3_3_6 is not set +# CT_CC_CORE_V_3_4_0 is not set +# CT_CC_CORE_V_3_4_1 is not set +# CT_CC_CORE_V_3_4_2 is not set +# CT_CC_CORE_V_3_4_3 is not set +# CT_CC_CORE_V_3_4_4 is not set +# CT_CC_CORE_V_3_4_5 is not set +# CT_CC_CORE_V_3_4_6 is not set +# CT_CC_CORE_V_4_0_0 is not set +# CT_CC_CORE_V_4_0_1 is not set +# CT_CC_CORE_V_4_0_2 is not set +# CT_CC_CORE_V_4_0_3 is not set +# CT_CC_CORE_V_4_0_4 is not set +# CT_CC_CORE_V_4_1_0 is not set +# CT_CC_CORE_V_4_1_1 is not set +CT_CC_CORE_EXTRA_CONFIG="" + +# +# Final C compiler +# +CT_CC_GCC=y +CT_CC_VERSION="4.1.1" +CT_CC="gcc" +# CT_CC_V_2_95_3 is not set +# CT_CC_V_3_2_3 is not set +# CT_CC_V_3_3 is not set +# CT_CC_V_3_3_1 is not set +# CT_CC_V_3_3_2 is not set +# CT_CC_V_3_3_3 is not set +# CT_CC_V_3_3_4 is not set +# CT_CC_V_3_3_5 is not set +# CT_CC_V_3_3_6 is not set +# CT_CC_V_3_4_0 is not set +# CT_CC_V_3_4_1 is not set +# CT_CC_V_3_4_2 is not set +# CT_CC_V_3_4_3 is not set +# CT_CC_V_3_4_4 is not set +# CT_CC_V_3_4_5 is not set +# CT_CC_V_4_0_0 is not set +# CT_CC_V_4_0_1 is not set +# CT_CC_V_4_0_2 is not set +# CT_CC_V_4_0_3 is not set +# CT_CC_V_4_0_4 is not set +# CT_CC_V_4_1_0 is not set +CT_CC_V_4_1_1=y +CT_CC_EXTRA_CONFIG="" +CT_CC_SUPPORT_C=y +CT_CC_SUPPORT_CXX=y +CT_CC_SUPPORT_JAVA=y + +# +# Supported languages: +# +CT_CC_LANG_C=y +CT_CC_LANG_CXX=y +# CT_CC_LANG_JAVA is not set + +# +# C-library +# +# CT_LIBC_GLIBC is not set +CT_LIBC_UCLIBC=y +CT_LIBC_VERSION="0.9.28.1" +CT_LIBC="uClibc" +# CT_LIBC_V_1_09_1 is not set +# CT_LIBC_V_2_0_1 is not set +# CT_LIBC_V_2_0_6 is not set +# CT_LIBC_V_2_1_1 is not set +# CT_LIBC_V_2_1_2 is not set +# CT_LIBC_V_2_1_3 is not set +# CT_LIBC_V_2_2 is not set +# CT_LIBC_V_2_2_1 is not set +# CT_LIBC_V_2_2_2 is not set +# CT_LIBC_V_2_2_3 is not set +# CT_LIBC_V_2_2_4 is not set +# CT_LIBC_V_2_2_5 is not set +# CT_LIBC_V_2_3 is not set +# CT_LIBC_V_2_3_1 is not set +# CT_LIBC_V_2_3_2 is not set +# CT_LIBC_V_2_3_3 is not set +# CT_LIBC_V_2_3_4 is not set +# CT_LIBC_V_2_3_5 is not set +# CT_LIBC_V_2_3_6 is not set +# CT_LIBC_V_2_4 is not set +# CT_LIBC_V_2_5 is not set +# CT_LIBC_GLIBC_THREADS_NPTL is not set +# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set +# CT_LIBC_GLIBC_THREADS_NONE is not set +CT_LIBC_GLIBC_EXTRA_CONFIG="" +CT_LIBC_GLIBC_EXTRA_CFLAGS="" +CT_LIBC_EXTRA_CC_ARGS="" +CT_LIBC_GLIBC_CONFIGPARMS="" +CT_LIBC_ADDONS="" +# CT_LIBC_V_snapshot is not set +# CT_LIBC_V_specific_date is not set +# CT_LIBC_V_0_9_26 is not set +# CT_LIBC_V_0_9_27 is not set +# CT_LIBC_V_0_9_28 is not set +CT_LIBC_V_0_9_28_1=y +CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y +# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set +# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set +CT_LIBC_UCLIBC_DEBUG_LEVEL=0 +CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config" +# CT_LIBC_UCLIBC_LOCALES is not set diff --git a/samples/i586-geode-linux-uclibc/linux-2.6.19.2.config b/samples/i586-geode-linux-uclibc/linux-2.6.19.2.config new file mode 100644 index 0000000..b2c383f --- /dev/null +++ b/samples/i586-geode-linux-uclibc/linux-2.6.19.2.config @@ -0,0 +1,1508 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.19.2 +# Wed Jan 31 21:35:53 2007 +# +CONFIG_X86_32=y +CONFIG_GENERIC_TIME=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_IPC_NS is not set +CONFIG_POSIX_MQUEUE=y +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_UTS_NS is not set +# CONFIG_AUDIT is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_RELAY is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_KMOD is not set + +# +# Block layer +# +CONFIG_BLOCK=y +CONFIG_LBD=y +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" + +# +# Processor type and features +# +# CONFIG_SMP is not set +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +CONFIG_MGEODEGX1=y +# CONFIG_MGEODE_LX is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=4 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_ALIGNMENT_16=y +CONFIG_X86_TSC=y +# CONFIG_HPET_TIMER is not set +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT is not set +# CONFIG_X86_UP_APIC is not set +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=y +CONFIG_VM86=y +# CONFIG_TOSHIBA is not set +# CONFIG_I8K is not set +# CONFIG_X86_REBOOTFIXUPS is not set +CONFIG_MICROCODE=y +CONFIG_MICROCODE_OLD_INTERFACE=y +CONFIG_X86_MSR=y +CONFIG_X86_CPUID=y + +# +# Firmware Drivers +# +# CONFIG_EDD is not set +# CONFIG_DELL_RBU is not set +# CONFIG_DCDBAS is not set +# CONFIG_NOHIGHMEM is not set +CONFIG_HIGHMEM4G=y +# CONFIG_HIGHMEM64G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_HIGHMEM=y +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_POPULATES_NODE_MAP=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_SPARSEMEM_STATIC=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_RESOURCES_64BIT=y +# CONFIG_HIGHPTE is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +CONFIG_REGPARM=y +CONFIG_SECCOMP=y +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +# CONFIG_KEXEC is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_PHYSICAL_START=0x100000 +CONFIG_COMPAT_VDSO=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +CONFIG_PM_LEGACY=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_SYSFS_DEPRECATED=y +# CONFIG_SOFTWARE_SUSPEND is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +# CONFIG_ACPI_VIDEO is not set +# CONFIG_ACPI_HOTKEY is not set +CONFIG_ACPI_FAN=y +# CONFIG_ACPI_DOCK is not set +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_THERMAL=y +# CONFIG_ACPI_ASUS is not set +# CONFIG_ACPI_IBM is not set +# CONFIG_ACPI_TOSHIBA is not set +CONFIG_ACPI_BLACKLIST_YEAR=2001 +CONFIG_ACPI_DEBUG=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y +# CONFIG_ACPI_CONTAINER is not set + +# +# APM (Advanced Power Management) BIOS Support +# +# CONFIG_APM is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_CPU_FREQ_DEBUG=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_STAT_DETAILS is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=y +# CONFIG_X86_POWERNOW_K6 is not set +# CONFIG_X86_POWERNOW_K7 is not set +CONFIG_X86_POWERNOW_K8=y +CONFIG_X86_POWERNOW_K8_ACPI=y +# CONFIG_X86_GX_SUSPMOD is not set +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +# CONFIG_X86_SPEEDSTEP_ICH is not set +# CONFIG_X86_SPEEDSTEP_SMI is not set +# CONFIG_X86_P4_CLOCKMOD is not set +# CONFIG_X86_CPUFREQ_NFORCE2 is not set +# CONFIG_X86_LONGRUN is not set +# CONFIG_X86_LONGHAUL is not set + +# +# shared options +# +CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y +# CONFIG_X86_SPEEDSTEP_LIB is not set + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCIEPORTBUS is not set +# CONFIG_PCI_DEBUG is not set +CONFIG_ISA_DMA_API=y +# CONFIG_ISA is not set +# CONFIG_MCA is not set +# CONFIG_SCx200 is not set +CONFIG_K8_NB=y + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +# CONFIG_INET_XFRM_MODE_BEET is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +# CONFIG_INET6_XFRM_MODE_BEET is not set +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_TCPPROBE is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# +# CONFIG_PNP is not set + +# +# Block devices +# +CONFIG_BLK_DEV_FD=y +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SX8 is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# Misc devices +# +# CONFIG_IBM_ASM is not set +# CONFIG_SGI_IOC4 is not set +# CONFIG_TIFM_CORE is not set + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +# CONFIG_BLK_DEV_CMD640 is not set +CONFIG_BLK_DEV_IDEPCI=y +# CONFIG_IDEPCI_SHARE_IRQ is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_GENERIC is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=y +# CONFIG_BLK_DEV_ATIIXP is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_CS5535 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_JMICRON is not set +# CONFIG_BLK_DEV_SC1200 is not set +CONFIG_BLK_DEV_PIIX=y +# CONFIG_BLK_DEV_IT821X is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_NETLINK=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=y +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=y +CONFIG_SCSI_FC_ATTRS=y +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set + +# +# SCSI low-level drivers +# +# CONFIG_ISCSI_TCP is not set +CONFIG_BLK_DEV_3W_XXXX_RAID=y +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +CONFIG_SCSI_AIC7XXX=y +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=5000 +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +# CONFIG_SCSI_AIC7XXX_OLD is not set +CONFIG_SCSI_AIC79XX=y +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=4000 +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +# CONFIG_AIC79XX_DEBUG_ENABLE is not set +CONFIG_AIC79XX_DEBUG_MASK=0 +# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_FC is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_LPFC is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# Serial ATA (prod) and Parallel ATA (experimental) drivers +# +CONFIG_ATA=y +CONFIG_SATA_AHCI=y +CONFIG_SATA_SVW=y +CONFIG_ATA_PIIX=y +# CONFIG_SATA_MV is not set +CONFIG_SATA_NV=y +# CONFIG_PDC_ADMA is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_PROMISE is not set +# CONFIG_SATA_SX4 is not set +CONFIG_SATA_SIL=y +# CONFIG_SATA_SIL24 is not set +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_ULI is not set +CONFIG_SATA_VIA=y +# CONFIG_SATA_VITESSE is not set +CONFIG_SATA_INTEL_COMBINED=y +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CS5535 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RZ1000 is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +# CONFIG_DM_CRYPT is not set +# CONFIG_DM_SNAPSHOT is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_SPI=y +# CONFIG_FUSION_FC is not set +# CONFIG_FUSION_SAS is not set +CONFIG_FUSION_MAX_SGE=128 +# CONFIG_FUSION_CTL is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=y + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set +# CONFIG_IEEE1394_EXPORT_FULL_API is not set + +# +# Device Drivers +# + +# +# Texas Instruments PCILynx requires I2C +# +CONFIG_IEEE1394_OHCI1394=y + +# +# Protocol Drivers +# +# CONFIG_IEEE1394_VIDEO1394 is not set +# CONFIG_IEEE1394_SBP2 is not set +# CONFIG_IEEE1394_ETH1394 is not set +# CONFIG_IEEE1394_DV1394 is not set +CONFIG_IEEE1394_RAWIO=y + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NET_VENDOR_3COM is not set + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +# CONFIG_DE2104X is not set +CONFIG_TULIP=y +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +# CONFIG_DE4X5 is not set +# CONFIG_WINBOND_840 is not set +# CONFIG_DM9102 is not set +# CONFIG_ULI526X is not set +# CONFIG_HP100 is not set +CONFIG_NET_PCI=y +# CONFIG_PCNET32 is not set +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +CONFIG_B44=y +CONFIG_FORCEDETH=y +# CONFIG_FORCEDETH_NAPI is not set +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +CONFIG_E100=y +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +CONFIG_8139CP=y +CONFIG_8139TOO=y +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_OLD_RX_RESET is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set +# CONFIG_VIA_RHINE is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set +# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_R8169=y +# CONFIG_R8169_NAPI is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set +CONFIG_SKY2=y +# CONFIG_SK98LIN is not set +# CONFIG_VIA_VELOCITY is not set +CONFIG_TIGON3=y +CONFIG_BNX2=y +# CONFIG_QLA3XXX is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_CHELSIO_T1 is not set +# CONFIG_IXGB is not set +# CONFIG_S2IO is not set +# CONFIG_MYRI10GE is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER is not set +CONFIG_NETCONSOLE=y +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_INTEL=y +CONFIG_HW_RANDOM_AMD=y +CONFIG_HW_RANDOM_GEODE=y +CONFIG_HW_RANDOM_VIA=y +# CONFIG_NVRAM is not set +CONFIG_RTC=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +CONFIG_AGP=y +# CONFIG_AGP_ALI is not set +# CONFIG_AGP_ATI is not set +# CONFIG_AGP_AMD is not set +CONFIG_AGP_AMD64=y +CONFIG_AGP_INTEL=y +# CONFIG_AGP_NVIDIA is not set +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_SWORKS is not set +# CONFIG_AGP_VIA is not set +# CONFIG_AGP_EFFICEON is not set +# CONFIG_DRM is not set +# CONFIG_MWAVE is not set +# CONFIG_PC8736x_GPIO is not set +# CONFIG_NSC_GPIO is not set +# CONFIG_CS5535_GPIO is not set +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_HANGCHECK_TIMER=y + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +# CONFIG_HWMON is not set +# CONFIG_HWMON_VID is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +# CONFIG_USB_DABUSB is not set + +# +# Graphics support +# +CONFIG_FIRMWARE_EDID=y +# CONFIG_FB is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_VGACON_SOFT_SCROLLBACK=y +CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=128 +CONFIG_VIDEO_SELECT=y +CONFIG_DUMMY_CONSOLE=y +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +# CONFIG_SND is not set + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=y +CONFIG_OSS_OBSOLETE_DRIVER=y +# CONFIG_SOUND_BT878 is not set +# CONFIG_SOUND_EMU10K1 is not set +# CONFIG_SOUND_FUSION is not set +# CONFIG_SOUND_ES1371 is not set +CONFIG_SOUND_ICH=y +# CONFIG_SOUND_TRIDENT is not set +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +# CONFIG_SOUND_VIA82CXXX is not set +# CONFIG_SOUND_OSS is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=y +# CONFIG_USB_EHCI_SPLIT_ISO is not set +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +# CONFIG_USB_EHCI_TT_NEWSCHED is not set +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_UHCI_HCD=y +# CONFIG_USB_SL811_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +CONFIG_USB_PRINTER=y + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_ACECAD is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_TOUCHSCREEN is not set +# CONFIG_USB_YEALINK is not set +# CONFIG_USB_XPAD is not set +# CONFIG_USB_ATI_REMOTE is not set +# CONFIG_USB_ATI_REMOTE2 is not set +# CONFIG_USB_KEYSPAN_REMOTE is not set +# CONFIG_USB_APPLETOUCH is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET_MII is not set +# CONFIG_USB_USBNET is not set +CONFIG_USB_MON=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_TEST is not set + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +# CONFIG_MMC is not set + +# +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers +# + +# +# InfiniBand support +# +# CONFIG_INFINIBAND is not set + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# +# CONFIG_EDAC is not set + +# +# Real Time Clock +# +# CONFIG_RTC_CLASS is not set + +# +# DMA Engine support +# +# CONFIG_DMA_ENGINE is not set + +# +# DMA Clients +# + +# +# DMA Devices +# + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +# CONFIG_EXT2_FS_SECURITY is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +# CONFIG_EXT3_FS_SECURITY is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +CONFIG_REISERFS_FS=y +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +CONFIG_REISERFS_FS_POSIX_ACL=y +# CONFIG_REISERFS_FS_SECURITY is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=y +# CONFIG_FUSE_FS is not set +CONFIG_GENERIC_ACL=y + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V3_ACL is not set +# CONFIG_NFSD_V4 is not set +CONFIG_NFSD_TCP=y +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +CONFIG_NLS_ISO8859_15=y +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=y + +# +# Instrumentation Support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=y +CONFIG_KPROBES=y + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_UNUSED_SYMBOLS=y +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_HIGHMEM is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_FRAME_POINTER is not set +CONFIG_UNWIND_INFO=y +CONFIG_STACK_UNWIND=y +# CONFIG_FORCED_INLINING is not set +# CONFIG_HEADERS_CHECK is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_LKDTM is not set +CONFIG_EARLY_PRINTK=y +CONFIG_DEBUG_STACKOVERFLOW=y +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_RODATA is not set +# CONFIG_4KSTACKS is not set +CONFIG_DOUBLEFAULT=y + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_PLIST=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_KTIME_SCALAR=y diff --git a/samples/i586-geode-linux-uclibc/uClibc-0.9.28.1.config b/samples/i586-geode-linux-uclibc/uClibc-0.9.28.1.config new file mode 100644 index 0000000..7a94163 --- /dev/null +++ b/samples/i586-geode-linux-uclibc/uClibc-0.9.28.1.config @@ -0,0 +1,172 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_bfin is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +TARGET_i386=y +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +# TARGET_mips is not set +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sh64 is not set +# TARGET_sparc is not set +# TARGET_v850 is not set +# TARGET_x86_64 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="i386" +# CONFIG_GENERIC_386 is not set +# CONFIG_386 is not set +# CONFIG_486 is not set +# CONFIG_586 is not set +CONFIG_586MMX=y +# CONFIG_686 is not set +# CONFIG_PENTIUMII is not set +# CONFIG_PENTIUMIII is not set +# CONFIG_PENTIUM4 is not set +# CONFIG_K6 is not set +# CONFIG_K7 is not set +# CONFIG_ELAN is not set +# CONFIG_CRUSOE is not set +# CONFIG_WINCHIPC6 is not set +# CONFIG_WINCHIP2 is not set +# CONFIG_CYRIXIII is not set +# CONFIG_NEHEMIAH is not set +ARCH_LITTLE_ENDIAN=y +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +KERNEL_SOURCE="/usr/src/linux" +C_SYMBOL_PREFIX="" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +LDSO_CACHE_SUPPORT=y +# LDSO_PRELOAD_FILE_SUPPORT is not set +LDSO_BASE_FILENAME="ld.so" +# LDSO_RUNPATH is not set +# DL_FINI_CRT_COMPAT is not set +UCLIBC_CTOR_DTOR=y +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +# PTHREADS_DEBUG_SUPPORT is not set +UCLIBC_HAS_LFS=y +UCLIBC_STATIC_LDCONFIG=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +# MALLOC_GLIBC_COMPAT is not set +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +UNIX98PTY_ONLY=y +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +# UCLIBC_HAS_IPV6 is not set +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_STRING_GENERIC_OPT=y +UCLIBC_HAS_STRING_ARCH_OPT=y +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +UCLIBC_HAS_CTYPE_UNSAFE=y +# UCLIBC_HAS_CTYPE_CHECKED is not set +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +UCLIBC_HAS_WORDEXP=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="$(DEVEL_PREFIX)/lib" +RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/" +DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/" + +# +# uClibc security related options +# +# UCLIBC_SECURITY is not set + +# +# uClibc development/debugging options +# +CROSS_COMPILER_PREFIX="" +# DODEBUG is not set +# DODEBUG_PT is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +WARNINGS="-Wall" +# UCLIBC_MJN3_ONLY is not set diff --git a/samples/i686-unknown-linux-uclibc/linux-2.6.19.2.config b/samples/i686-unknown-linux-uclibc/linux-2.6.19.2.config new file mode 100644 index 0000000..b2c383f --- /dev/null +++ b/samples/i686-unknown-linux-uclibc/linux-2.6.19.2.config @@ -0,0 +1,1508 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.19.2 +# Wed Jan 31 21:35:53 2007 +# +CONFIG_X86_32=y +CONFIG_GENERIC_TIME=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_IPC_NS is not set +CONFIG_POSIX_MQUEUE=y +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_UTS_NS is not set +# CONFIG_AUDIT is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_RELAY is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_KMOD is not set + +# +# Block layer +# +CONFIG_BLOCK=y +CONFIG_LBD=y +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" + +# +# Processor type and features +# +# CONFIG_SMP is not set +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +CONFIG_MGEODEGX1=y +# CONFIG_MGEODE_LX is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=4 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_ALIGNMENT_16=y +CONFIG_X86_TSC=y +# CONFIG_HPET_TIMER is not set +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT is not set +# CONFIG_X86_UP_APIC is not set +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=y +CONFIG_VM86=y +# CONFIG_TOSHIBA is not set +# CONFIG_I8K is not set +# CONFIG_X86_REBOOTFIXUPS is not set +CONFIG_MICROCODE=y +CONFIG_MICROCODE_OLD_INTERFACE=y +CONFIG_X86_MSR=y +CONFIG_X86_CPUID=y + +# +# Firmware Drivers +# +# CONFIG_EDD is not set +# CONFIG_DELL_RBU is not set +# CONFIG_DCDBAS is not set +# CONFIG_NOHIGHMEM is not set +CONFIG_HIGHMEM4G=y +# CONFIG_HIGHMEM64G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_HIGHMEM=y +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_POPULATES_NODE_MAP=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_SPARSEMEM_STATIC=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_RESOURCES_64BIT=y +# CONFIG_HIGHPTE is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +CONFIG_REGPARM=y +CONFIG_SECCOMP=y +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +# CONFIG_KEXEC is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_PHYSICAL_START=0x100000 +CONFIG_COMPAT_VDSO=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +CONFIG_PM_LEGACY=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_SYSFS_DEPRECATED=y +# CONFIG_SOFTWARE_SUSPEND is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +# CONFIG_ACPI_VIDEO is not set +# CONFIG_ACPI_HOTKEY is not set +CONFIG_ACPI_FAN=y +# CONFIG_ACPI_DOCK is not set +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_THERMAL=y +# CONFIG_ACPI_ASUS is not set +# CONFIG_ACPI_IBM is not set +# CONFIG_ACPI_TOSHIBA is not set +CONFIG_ACPI_BLACKLIST_YEAR=2001 +CONFIG_ACPI_DEBUG=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y +# CONFIG_ACPI_CONTAINER is not set + +# +# APM (Advanced Power Management) BIOS Support +# +# CONFIG_APM is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_CPU_FREQ_DEBUG=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_STAT_DETAILS is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=y +# CONFIG_X86_POWERNOW_K6 is not set +# CONFIG_X86_POWERNOW_K7 is not set +CONFIG_X86_POWERNOW_K8=y +CONFIG_X86_POWERNOW_K8_ACPI=y +# CONFIG_X86_GX_SUSPMOD is not set +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +# CONFIG_X86_SPEEDSTEP_ICH is not set +# CONFIG_X86_SPEEDSTEP_SMI is not set +# CONFIG_X86_P4_CLOCKMOD is not set +# CONFIG_X86_CPUFREQ_NFORCE2 is not set +# CONFIG_X86_LONGRUN is not set +# CONFIG_X86_LONGHAUL is not set + +# +# shared options +# +CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y +# CONFIG_X86_SPEEDSTEP_LIB is not set + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCIEPORTBUS is not set +# CONFIG_PCI_DEBUG is not set +CONFIG_ISA_DMA_API=y +# CONFIG_ISA is not set +# CONFIG_MCA is not set +# CONFIG_SCx200 is not set +CONFIG_K8_NB=y + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +# CONFIG_INET_XFRM_MODE_BEET is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +# CONFIG_INET6_XFRM_MODE_BEET is not set +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_TCPPROBE is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# +# CONFIG_PNP is not set + +# +# Block devices +# +CONFIG_BLK_DEV_FD=y +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SX8 is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# Misc devices +# +# CONFIG_IBM_ASM is not set +# CONFIG_SGI_IOC4 is not set +# CONFIG_TIFM_CORE is not set + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +# CONFIG_BLK_DEV_CMD640 is not set +CONFIG_BLK_DEV_IDEPCI=y +# CONFIG_IDEPCI_SHARE_IRQ is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_GENERIC is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=y +# CONFIG_BLK_DEV_ATIIXP is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_CS5535 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_JMICRON is not set +# CONFIG_BLK_DEV_SC1200 is not set +CONFIG_BLK_DEV_PIIX=y +# CONFIG_BLK_DEV_IT821X is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_NETLINK=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=y +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=y +CONFIG_SCSI_FC_ATTRS=y +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set + +# +# SCSI low-level drivers +# +# CONFIG_ISCSI_TCP is not set +CONFIG_BLK_DEV_3W_XXXX_RAID=y +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +CONFIG_SCSI_AIC7XXX=y +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=5000 +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +# CONFIG_SCSI_AIC7XXX_OLD is not set +CONFIG_SCSI_AIC79XX=y +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=4000 +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +# CONFIG_AIC79XX_DEBUG_ENABLE is not set +CONFIG_AIC79XX_DEBUG_MASK=0 +# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_FC is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_LPFC is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# Serial ATA (prod) and Parallel ATA (experimental) drivers +# +CONFIG_ATA=y +CONFIG_SATA_AHCI=y +CONFIG_SATA_SVW=y +CONFIG_ATA_PIIX=y +# CONFIG_SATA_MV is not set +CONFIG_SATA_NV=y +# CONFIG_PDC_ADMA is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_PROMISE is not set +# CONFIG_SATA_SX4 is not set +CONFIG_SATA_SIL=y +# CONFIG_SATA_SIL24 is not set +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_ULI is not set +CONFIG_SATA_VIA=y +# CONFIG_SATA_VITESSE is not set +CONFIG_SATA_INTEL_COMBINED=y +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CS5535 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RZ1000 is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +# CONFIG_DM_CRYPT is not set +# CONFIG_DM_SNAPSHOT is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_SPI=y +# CONFIG_FUSION_FC is not set +# CONFIG_FUSION_SAS is not set +CONFIG_FUSION_MAX_SGE=128 +# CONFIG_FUSION_CTL is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=y + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set +# CONFIG_IEEE1394_EXPORT_FULL_API is not set + +# +# Device Drivers +# + +# +# Texas Instruments PCILynx requires I2C +# +CONFIG_IEEE1394_OHCI1394=y + +# +# Protocol Drivers +# +# CONFIG_IEEE1394_VIDEO1394 is not set +# CONFIG_IEEE1394_SBP2 is not set +# CONFIG_IEEE1394_ETH1394 is not set +# CONFIG_IEEE1394_DV1394 is not set +CONFIG_IEEE1394_RAWIO=y + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NET_VENDOR_3COM is not set + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +# CONFIG_DE2104X is not set +CONFIG_TULIP=y +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +# CONFIG_DE4X5 is not set +# CONFIG_WINBOND_840 is not set +# CONFIG_DM9102 is not set +# CONFIG_ULI526X is not set +# CONFIG_HP100 is not set +CONFIG_NET_PCI=y +# CONFIG_PCNET32 is not set +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +CONFIG_B44=y +CONFIG_FORCEDETH=y +# CONFIG_FORCEDETH_NAPI is not set +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +CONFIG_E100=y +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +CONFIG_8139CP=y +CONFIG_8139TOO=y +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_OLD_RX_RESET is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set +# CONFIG_VIA_RHINE is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set +# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_R8169=y +# CONFIG_R8169_NAPI is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set +CONFIG_SKY2=y +# CONFIG_SK98LIN is not set +# CONFIG_VIA_VELOCITY is not set +CONFIG_TIGON3=y +CONFIG_BNX2=y +# CONFIG_QLA3XXX is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_CHELSIO_T1 is not set +# CONFIG_IXGB is not set +# CONFIG_S2IO is not set +# CONFIG_MYRI10GE is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER is not set +CONFIG_NETCONSOLE=y +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_INTEL=y +CONFIG_HW_RANDOM_AMD=y +CONFIG_HW_RANDOM_GEODE=y +CONFIG_HW_RANDOM_VIA=y +# CONFIG_NVRAM is not set +CONFIG_RTC=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +CONFIG_AGP=y +# CONFIG_AGP_ALI is not set +# CONFIG_AGP_ATI is not set +# CONFIG_AGP_AMD is not set +CONFIG_AGP_AMD64=y +CONFIG_AGP_INTEL=y +# CONFIG_AGP_NVIDIA is not set +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_SWORKS is not set +# CONFIG_AGP_VIA is not set +# CONFIG_AGP_EFFICEON is not set +# CONFIG_DRM is not set +# CONFIG_MWAVE is not set +# CONFIG_PC8736x_GPIO is not set +# CONFIG_NSC_GPIO is not set +# CONFIG_CS5535_GPIO is not set +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_HANGCHECK_TIMER=y + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +# CONFIG_HWMON is not set +# CONFIG_HWMON_VID is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +# CONFIG_USB_DABUSB is not set + +# +# Graphics support +# +CONFIG_FIRMWARE_EDID=y +# CONFIG_FB is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_VGACON_SOFT_SCROLLBACK=y +CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=128 +CONFIG_VIDEO_SELECT=y +CONFIG_DUMMY_CONSOLE=y +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +# CONFIG_SND is not set + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=y +CONFIG_OSS_OBSOLETE_DRIVER=y +# CONFIG_SOUND_BT878 is not set +# CONFIG_SOUND_EMU10K1 is not set +# CONFIG_SOUND_FUSION is not set +# CONFIG_SOUND_ES1371 is not set +CONFIG_SOUND_ICH=y +# CONFIG_SOUND_TRIDENT is not set +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +# CONFIG_SOUND_VIA82CXXX is not set +# CONFIG_SOUND_OSS is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=y +# CONFIG_USB_EHCI_SPLIT_ISO is not set +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +# CONFIG_USB_EHCI_TT_NEWSCHED is not set +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_UHCI_HCD=y +# CONFIG_USB_SL811_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +CONFIG_USB_PRINTER=y + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_ACECAD is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_TOUCHSCREEN is not set +# CONFIG_USB_YEALINK is not set +# CONFIG_USB_XPAD is not set +# CONFIG_USB_ATI_REMOTE is not set +# CONFIG_USB_ATI_REMOTE2 is not set +# CONFIG_USB_KEYSPAN_REMOTE is not set +# CONFIG_USB_APPLETOUCH is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET_MII is not set +# CONFIG_USB_USBNET is not set +CONFIG_USB_MON=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_TEST is not set + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +# CONFIG_MMC is not set + +# +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers +# + +# +# InfiniBand support +# +# CONFIG_INFINIBAND is not set + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# +# CONFIG_EDAC is not set + +# +# Real Time Clock +# +# CONFIG_RTC_CLASS is not set + +# +# DMA Engine support +# +# CONFIG_DMA_ENGINE is not set + +# +# DMA Clients +# + +# +# DMA Devices +# + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +# CONFIG_EXT2_FS_SECURITY is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +# CONFIG_EXT3_FS_SECURITY is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +CONFIG_REISERFS_FS=y +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +CONFIG_REISERFS_FS_POSIX_ACL=y +# CONFIG_REISERFS_FS_SECURITY is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=y +# CONFIG_FUSE_FS is not set +CONFIG_GENERIC_ACL=y + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V3_ACL is not set +# CONFIG_NFSD_V4 is not set +CONFIG_NFSD_TCP=y +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +CONFIG_NLS_ISO8859_15=y +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=y + +# +# Instrumentation Support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=y +CONFIG_KPROBES=y + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_UNUSED_SYMBOLS=y +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_HIGHMEM is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_FRAME_POINTER is not set +CONFIG_UNWIND_INFO=y +CONFIG_STACK_UNWIND=y +# CONFIG_FORCED_INLINING is not set +# CONFIG_HEADERS_CHECK is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_LKDTM is not set +CONFIG_EARLY_PRINTK=y +CONFIG_DEBUG_STACKOVERFLOW=y +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_RODATA is not set +# CONFIG_4KSTACKS is not set +CONFIG_DOUBLEFAULT=y + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_PLIST=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_KTIME_SCALAR=y diff --git a/samples/i686-unknown-linux-uclibc/uClibc-0.9.28.1.config b/samples/i686-unknown-linux-uclibc/uClibc-0.9.28.1.config new file mode 100644 index 0000000..7a94163 --- /dev/null +++ b/samples/i686-unknown-linux-uclibc/uClibc-0.9.28.1.config @@ -0,0 +1,172 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_bfin is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +TARGET_i386=y +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +# TARGET_mips is not set +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sh64 is not set +# TARGET_sparc is not set +# TARGET_v850 is not set +# TARGET_x86_64 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="i386" +# CONFIG_GENERIC_386 is not set +# CONFIG_386 is not set +# CONFIG_486 is not set +# CONFIG_586 is not set +CONFIG_586MMX=y +# CONFIG_686 is not set +# CONFIG_PENTIUMII is not set +# CONFIG_PENTIUMIII is not set +# CONFIG_PENTIUM4 is not set +# CONFIG_K6 is not set +# CONFIG_K7 is not set +# CONFIG_ELAN is not set +# CONFIG_CRUSOE is not set +# CONFIG_WINCHIPC6 is not set +# CONFIG_WINCHIP2 is not set +# CONFIG_CYRIXIII is not set +# CONFIG_NEHEMIAH is not set +ARCH_LITTLE_ENDIAN=y +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +KERNEL_SOURCE="/usr/src/linux" +C_SYMBOL_PREFIX="" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +LDSO_CACHE_SUPPORT=y +# LDSO_PRELOAD_FILE_SUPPORT is not set +LDSO_BASE_FILENAME="ld.so" +# LDSO_RUNPATH is not set +# DL_FINI_CRT_COMPAT is not set +UCLIBC_CTOR_DTOR=y +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +# PTHREADS_DEBUG_SUPPORT is not set +UCLIBC_HAS_LFS=y +UCLIBC_STATIC_LDCONFIG=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +# MALLOC_GLIBC_COMPAT is not set +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +UNIX98PTY_ONLY=y +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +# UCLIBC_HAS_IPV6 is not set +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_STRING_GENERIC_OPT=y +UCLIBC_HAS_STRING_ARCH_OPT=y +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +UCLIBC_HAS_CTYPE_UNSAFE=y +# UCLIBC_HAS_CTYPE_CHECKED is not set +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +UCLIBC_HAS_WORDEXP=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="$(DEVEL_PREFIX)/lib" +RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/" +DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/" + +# +# uClibc security related options +# +# UCLIBC_SECURITY is not set + +# +# uClibc development/debugging options +# +CROSS_COMPILER_PREFIX="" +# DODEBUG is not set +# DODEBUG_PT is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +WARNINGS="-Wall" +# UCLIBC_MJN3_ONLY is not set diff --git a/scripts/build/binutils.sh b/scripts/build/binutils.sh new file mode 100644 index 0000000..26493c4 --- /dev/null +++ b/scripts/build/binutils.sh @@ -0,0 +1,39 @@ +# This file adds functions to build binutils +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +do_binutils() { + mkdir -p "${CT_BUILD_DIR}/build-binutils" + cd "${CT_BUILD_DIR}/build-binutils" + + CT_DoStep INFO "Installing binutils" + + CT_DoLog EXTRA "Configuring binutils" + CFLAGS="${CT_CFLAGS_FOR_HOST}" \ + "${CT_SRC_DIR}/${CT_BINUTILS_FILE}/configure" \ + ${CT_CANADIAN_OPT} \ + --target=${CT_TARGET} \ + --host=${CT_HOST} \ + --prefix=${CT_PREFIX_DIR} \ + --disable-nls \ + ${CT_BINUTILS_EXTRA_CONFIG} \ + ${BINUTILS_SYSROOT_ARG} 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Building binutils" + make ${PARALLELMFLAGS} 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing binutils" + make install 2>&1 |CT_DoLog DEBUG + + # Make those new tools available to the core C compiler to come: + # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as + # well. Create that (libfloat is one such sucker). + mkdir -p "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/bin" + mkdir -p "${CT_CC_CORE_PREFIX_DIR}/bin" + for t in ar as ld strip; do + ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/bin/${t}" + ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_PREFIX_DIR}/bin/${CT_TARGET}-${t}" + done |CT_DoLog DEBUG + + CT_EndStep +} diff --git a/scripts/build/cc_core_gcc.sh b/scripts/build/cc_core_gcc.sh new file mode 100644 index 0000000..720a581 --- /dev/null +++ b/scripts/build/cc_core_gcc.sh @@ -0,0 +1,58 @@ +# This file adds the function to build the core gcc C compiler +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +do_cc_core() { + mkdir -p "${CT_BUILD_DIR}/build-cc-core" + cd "${CT_BUILD_DIR}/build-cc-core" + + CT_DoStep INFO "Installing core C compiler" + + CT_DoLog EXTRA "Copy headers to install area of bootstrap gcc, so it can build libgcc2" + mkdir -p "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/include" + cp -r "${CT_HEADERS_DIR}"/* "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/include" 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Configuring core C compiler" + + extra_config="" + [ "${CT_ARCH_FLOAT_SW}" = "y" ] && extra_config="${extra_config} --with-float=soft" + [ -n "${CT_ARCH_CPU}" ] && extra_config="${extra_config} --with-cpu=${CT_ARCH_CPU}" + [ -n "${CT_ARCH_TUNE}" ] && extra_config="${extra_config} --with-tune=${CT_ARCH_TUNE}" + [ -n "${CT_ARCH_ARCH}" ] && extra_config="${extra_config} --with-arch=${CT_ARCH_ARCH}" + [ -n "${CT_ARCH_FPU}" ] && extra_config="${extra_config} --with-fpu=${CT_ARCH_FPU}" + + CT_DoLog DEBUG "Extra config passed: \"${extra_config}\"" + + # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532) + CFLAGS="${CT_CFLAGS_FOR_HOST}" \ + "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/configure" \ + ${CT_CANADIAN_OPT} \ + --target=${CT_TARGET} \ + --host=${CT_HOST} \ + --prefix="${CT_CC_CORE_PREFIX_DIR}" \ + --with-local-prefix="${CT_SYSROOT_DIR}" \ + --disable-multilib \ + --with-newlib \ + ${CC_CORE_SYSROOT_ARG} \ + ${extra_config} \ + --disable-nls \ + --enable-threads=no \ + --enable-symvers=gnu \ + --enable-__cxa_atexit \ + --enable-languages=c \ + --disable-shared \ + ${CT_CC_CORE_EXTRA_CONFIG} 2>&1 |CT_DoLog DEBUG + + if [ ! "${CT_CANADIAN}" = "y" ]; then + CT_DoLog EXTRA "Building libiberty" + make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog DEBUG + fi + + CT_DoLog EXTRA "Building core C compiler" + make ${PARALLELMFLAGS} all-gcc 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing core C compiler" + make install-gcc 2>&1 |CT_DoLog DEBUG + + CT_EndStep +} diff --git a/scripts/build/cc_core_tcc.sh b/scripts/build/cc_core_tcc.sh new file mode 100644 index 0000000..e69de29 diff --git a/scripts/build/cc_gcc.sh b/scripts/build/cc_gcc.sh new file mode 100644 index 0000000..7621d42 --- /dev/null +++ b/scripts/build/cc_gcc.sh @@ -0,0 +1,115 @@ +# This file adds the function to build the final gcc C compiler +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +do_cc() { + CT_DoStep INFO "Installing final C compiler" + + mkdir -p "${CT_BUILD_DIR}/build-cc" + cd "${CT_BUILD_DIR}/build-cc" + + CT_DoLog EXTRA "Configuring C compiler" + + # Enable selected languages + lang_opt="c" + [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++" + [ "${CT_CC_LANG_FORTRAN}" = "y" ] && lang_opt="${lang_opt},fortran" + [ "${CT_CC_LANG_ADA}" = "y" ] && lang_opt="${lang_opt},ada" + [ "${CT_CC_LANG_JAVA}" = "y" ] && lang_opt="${lang_opt},java" + [ "${CT_CC_LANG_OBJC}" = "y" ] && lang_opt="${lang_opt},objc" + [ "${CT_CC_LANG_OBJCXX}" = "y" ] && lang_opt="${lang_opt},obj-c++" + CT_Test "Building Fortran language is not yet supported. Will try..." "${CT_CC_LANG_FORTRAN}" = "y" + CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y" + CT_Test "Building Java language is not yet supported. Will try..." "${CT_CC_LANG_JAVA}" = "y" + CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y" + CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y" + CT_Test "Building ${CT_CC_LANG_OTHERS} language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}" + lang_opt=`echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/^(.*),*$/\1/;'` + + extra_config="--enable-languages=${lang_opt}" + [ "${CT_ARCH_FLOAT_SW}" = "y" ] && extra_config="${extra_config} --with-float=soft" + [ "${CT_SHARED_LIBS}" = "y" ] || extra_config="${extra_config} --disable-shared" + [ -n "${CT_ARCH_CPU}" ] && extra_config="${extra_config} --with-cpu=${CT_ARCH_CPU}" + [ -n "${CT_ARCH_TUNE}" ] && extra_config="${extra_config} --with-tune=${CT_ARCH_TUNE}" + [ -n "${CT_ARCH_ARCH}" ] && extra_config="${extra_config} --with-arch=${CT_ARCH_ARCH}" + [ -n "${CT_ARCH_FPU}" ] && extra_config="${extra_config} --with-fpu=${CT_ARCH_FPU}" + if [ "${CT_TARGET_MULTILIB}" = "y" ]; then + extra_config="${extra_config} --enable-multilib" + else + extra_config="${extra_config} --disable-multilib" + fi + + CT_DoLog DEBUG "Extra config passed: \"${extra_config}\"" + + # --enable-symvers=gnu really only needed for sh4 to work around a + # detection problem only matters for gcc-3.2.x and later, I think. + # --disable-nls to work around crash bug on ppc405, but also because + # embedded systems don't really need message catalogs... + CFLAGS="${CT_CFLAGS_FOR_HOST}" \ + "${CT_SRC_DIR}/${CT_CC_FILE}/configure" \ + ${CT_CANADIAN_OPT} \ + --target=${CT_TARGET} --host=${CT_HOST} \ + --prefix="${CT_PREFIX_DIR}" \ + ${CC_SYSROOT_ARG} \ + ${extra_config} \ + --with-local-prefix="${CT_SYSROOT_DIR}" \ + --disable-nls \ + --enable-threads=posix \ + --enable-symvers=gnu \ + --enable-__cxa_atexit \ + --enable-c99 \ + --enable-long-long \ + ${CT_CC_EXTRA_CONFIG} 2>&1 |CT_DoLog DEBUG + + if [ ! "${CT_CANADIAN}" = "y" ]; then + CT_DoLog EXTRA "Building libiberty" + make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog DEBUG + fi + + + # Idea from : + # Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64. + # GCC 3.4.0 and up don't suffer from this confusion, and don't need this + # kludge. + # FIXME: we should patch gcc's source rather than uglify crosstool.sh. + # FIXME: is this needed for gcc-3.3.[56]? + case "${CT_CC_FILE}" in + gcc-3.3.[34]) + case "${CT_TARGET}" in + powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu) + for d in `find "${CT_SYSROOT_DIR}" -name lib -type d -empty`; do + if [ -d `dirname "${d}"`/lib64 ] ; then + rm -rf "${d}" + ln -s `dirname "${d}"`/lib64 "${d}" + fi + done ;; + *) ;; + esac ;; + esac + + CT_DoLog EXTRA "Building C compiler" + make ${PARALLELMFLAGS} all 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing C compiler" + make install 2>&1 |CT_DoLog DEBUG + + # FIXME: shouldn't people who want this just --disable-multilib in final gcc + # and be done with it? + # This code should probably be deleted, it was written long ago and hasn't + # been tested in ages. + # kludge: If the chip does not have a floating point unit + # (i.e. if GLIBC_EXTRA_CONFIG contains --without-fp), + # and there are shared libraries in /lib/nof, copy them to /lib + # so they get used by default. + # FIXME: only rs6000/powerpc seem to use nof. See MULTILIB_DIRNAMES + # in $GCC_DIR/gcc/config/$TARGET/* to see what your arch calls it. + #case "${CT_LIBC_EXTRA_CONFIG}" in + # *--without-fp*) + # if test -d "${CT_SYSROOT_DIR}/lib/nof"; then + # cp -af "${CT_SYSROOT_DIR}/lib/nof/"*.so* "${CT_SYSROOT_DIR}/lib" || true + # fi + # ;; + #esac + + CT_EndStep +} diff --git a/scripts/build/cc_tcc.sh b/scripts/build/cc_tcc.sh new file mode 100644 index 0000000..e69de29 diff --git a/scripts/build/kernel_cygwin.sh b/scripts/build/kernel_cygwin.sh new file mode 100644 index 0000000..e69de29 diff --git a/scripts/build/kernel_linux-libc-headers.sh b/scripts/build/kernel_linux-libc-headers.sh new file mode 120000 index 0000000..05c7045 --- /dev/null +++ b/scripts/build/kernel_linux-libc-headers.sh @@ -0,0 +1 @@ +kernel_linux.sh \ No newline at end of file diff --git a/scripts/build/kernel_linux.sh b/scripts/build/kernel_linux.sh new file mode 100644 index 0000000..caf35d1 --- /dev/null +++ b/scripts/build/kernel_linux.sh @@ -0,0 +1,148 @@ +# This file declares functions to install the kernel headers for linux +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +# Check kernel configuration +do_kernel_check_config() { + CT_DoStep INFO "Checking kernel configuration" + + CT_TestOrAbort "You did not provide a kernel config file!" -n "${CT_KERNEL_LINUX_CONFIG_FILE}" -a -f "${CT_KERNEL_LINUX_CONFIG_FILE}" + + CT_EndStep +} + +# Wrapper to the actual headers install method +do_kernel_headers() { + CT_DoStep INFO "Installing kernel headers" + + # We need to enter this directory to find the kernel version strings + cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}" + if [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" != "y" ]; then + k_version=`awk '/^VERSION =/ { print $3 }' Makefile` + k_patchlevel=`awk '/^PATCHLEVEL =/ { print $3 }' Makefile` + k_sublevel=`awk '/^SUBLEVEL =/ { print $3 }' Makefile` + k_extraversion=`awk '/^EXTRAVERSION =/ { print $3 }' Makefile` + else + k_version=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 1` + k_patchlevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 2` + k_sublevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 3` + k_extraversion=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 4` + fi + + case "${k_version}.${k_patchlevel}" in + 2.2|2.4|2.6) ;; + *) CT_Abort "Unsupported kernel version \"linux-${k_version}.${k_patchlevel}\".";; + esac + + # Kernel version that support verbosity will use this, others will ignore it: + V_OPT="V=${CT_KERNEL_LINUX_VERBOSE_LEVEL}" + + if [ "${CT_KERNEL_LINUX_HEADERS_INSTALL}" = "y" ]; then + do_kernel_install + elif [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" = "y" ]; then + do_kernel_sanitised + else [ "${CT_KERNEL_LINUX_HEADERS_COPY}" = "y" ]; + do_kernel_copy + fi + + CT_EndStep +} + +# Install kernel headers using headers_install from kernel sources. +do_kernel_install() { + CT_DoLog EXTRA "Using kernel's headers_install" + + mkdir -p "${CT_BUILD_DIR}/build-kernel-headers" + cd "${CT_BUILD_DIR}/build-kernel-headers" + + case "${k_version}.${k_patchlevel}" in + 2.6) [ ${k_sublevel} -ge 18 ] || CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";; + *) CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";; + esac + + CT_DoLog EXTRA "Configuring kernel headers" + cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config + CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}" \ + O="${CT_BUILD_DIR}/build-kernel-headers" \ + ${V_OPT} \ + ARCH=${CT_KERNEL_ARCH} oldconfig 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing kernel headers" + make ARCH=${CT_KERNEL_ARCH} \ + INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr" \ + ${V_OPT} \ + headers_install 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Checking installed headers" + make ARCH=${CT_KERNEL_ARCH} \ + INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr" \ + ${V_OPT} \ + headers_check 2>&1 |CT_DoLog DEBUG +} + +# Install kernel headers from oldish Mazur's sanitised headers. +do_kernel_sanitised() { + CT_DoLog EXTRA "Copying sanitised headers" + cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}" + cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG + cp -rv "include/asm-${CT_KERNEL_ARCH}" "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG +} + +# Install kernel headers by plain copy. +do_kernel_copy() { + CT_DoLog EXTRA "Copying plain kernel headers" + CT_DoLog WARN "You are using plain kernel headers. You really shouldn't do that." + CT_DoLog WARN "You'd be better off by using installed headers (or sanitised headers)." + + # 2.2 and 2.4 don't support building out-of-tree. 2.6 does. + CT_DoLog EXTRA "Preparing kernel headers" + case "${k_version}.${k_patchlevel}" in + 2.2|2.4) cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}" + cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config + CT_DoYes "" |make ARCH=${CT_KERNEL_ARCH} oldconfig + # 2.4 doesn't follow V=# for verbosity... :-( + make ARCH=${CT_KERNEL_ARCH} symlinks include/linux/version.h + ;; + 2.6) mkdir -p "${CT_BUILD_DIR}/build-kernel-headers" + cd "${CT_BUILD_DIR}/build-kernel-headers" + cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config + CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}" \ + O="`pwd`" ${V_OPT} ARCH=${CT_KERNEL_ARCH} \ + oldconfig + case "${CT_KERNEL_ARCH}" in + sh*) # sh does secret stuff in 'make prepare' that can't be + # triggered separately, but happily, it doesn't use + # target gcc, so we can use it. + # Update: this fails on 2.6.11, as it installs + # elfconfig.h, which requires target compiler :-( + make ${PARALLELMFLAGS} \ + ARCH=${CT_KERNEL_ARCH} ${V_OPT} \ + prepare include/linux/version.h + ;; + arm*|cris*) make ${PARALLELMFLAGS} \ + ARCH=${CT_KERNEL_ARCH} ${V_OPT} \ + include/asm include/linux/version.h \ + include/asm-${CT_KERNEL_ARCH}/.arch + ;; + mips*) # for linux-2.6, 'make prepare' for mips doesn't + # actually create any symlinks. Hope generic is ok. + # Note that glibc ignores all -I flags passed in CFLAGS, + # so you have to use -isystem. + make ${PARALLELMFLAGS} \ + ARCH=${CT_KERNEL_ARCH} ${V_OPT} \ + include/asm include/linux/version.h + TARGET_CFLAGS="${TARGET_CFLAGS} -isystem ${LINUX_HEADER_DIR}/include/asm-mips/mach-generic" + ;; + *) make ${PARALLELMFLAGS} \ + ARCH=${CT_KERNEL_ARCH} ${V_OPT} \ + include/asm include/linux/version.h + ;; + esac + ;; + esac 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Copying kernel headers" + cp -rv include/asm-generic "${CT_HEADERS_DIR}/asm-generic" 2>&1 |CT_DoLog DEBUG + cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG + cp -rv include/asm-${CT_KERNEL_ARCH} "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG +} diff --git a/scripts/build/libc_glibc.sh b/scripts/build/libc_glibc.sh new file mode 100644 index 0000000..2fa9ac7 --- /dev/null +++ b/scripts/build/libc_glibc.sh @@ -0,0 +1,285 @@ +# This file adds functions to build glibc +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +# There is nothing to do for glibc check config +do_libc_check_config() { + CT_DoStep INFO "Checking C library configuration" + CT_DoLog EXTRA "glibc has nothing to check" + CT_EndStep +} + +# This function installs the glibc headers needed to build the core compiler +do_libc_headers() { + # Only need to install bootstrap glibc headers for gcc-3.0 and above? Or maybe just gcc-3.3 and above? + # See also http://gcc.gnu.org/PR8180, which complains about the need for this step. + grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/ChangeLog" || return 0 + + CT_DoStep INFO "Installing C library headers" + + mkdir -p "${CT_BUILD_DIR}/build-libc-headers" + cd "${CT_BUILD_DIR}/build-libc-headers" + + CT_DoLog EXTRA "Configuring C library headers" + + # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions. + # 1. override CC to keep glibc's configure from using $TARGET-gcc. + # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly + # 3. build with gcc 3.2 or later + # Compare these options with the ones used when building glibc for real below - they're different. + # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode + # so when configure checks to make sure gcc has access to the assembler you just built... + # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path. + # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet) + # Note: the warning + # "*** WARNING: Are you sure you do not want to use the `linuxthreads'" + # *** add-on?" + # is ok here, since all we want are the basic headers at this point. + # Override libc_cv_ppc_machine so glibc-cvs doesn't complain + # 'a version of binutils that supports .machine "altivec" is needed'. + libc_cv_ppc_machine=yes \ + CC=${CT_CC_NATIVE} \ + "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \ + --build="${CT_BUILD}" \ + --host="${CT_TARGET}" \ + --prefix=/usr \ + --with-headers="${CT_HEADERS_DIR}" \ + --without-cvs --disable-sanity-checks \ + --enable-hacker-mode \ + --enable-add-ons="" \ + --without-nptl 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing C library headers" + + if grep -q GLIBC_2.3 "${CT_SRC_DIR}/${CT_LIBC_FILE}/ChangeLog"; then + # glibc-2.3.x passes cross options to $(CC) when generating errlist-compat.c, + # which fails without a real cross-compiler. + # Fortunately, we don't need errlist-compat.c, since we just need .h + # files, so work around this by creating a fake errlist-compat.c and + # satisfying its dependencies. + # Another workaround might be to tell configure to not use any cross + # options to $(CC). + # The real fix would be to get install-headers to not generate + # errlist-compat.c. + # Note: BOOTSTRAP_GCC is used by: + # patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch + libc_cv_ppc_machine=yes \ + make CFLAGS=-DBOOTSTRAP_GCC sysdeps/gnu/errlist.c 2>&1 |CT_DoLog DEBUG + mkdir -p stdio-common + # sleep for 2 seconds for benefit of filesystems with lousy time + # resolution, like FAT, so make knows for sure errlist-compat.c doesn't + # need generating + sleep 2 + touch stdio-common/errlist-compat.c + fi + # Note: BOOTSTRAP_GCC (see above) + libc_cv_ppc_machine=yes \ + make cross-compiling=yes install_root=${CT_SYSROOT_DIR} \ + CFLAGS=-DBOOTSTRAP_GCC ${LIBC_SYSROOT_ARG} \ + install-headers 2>&1 |CT_DoLog DEBUG + + # Two headers -- stubs.h and features.h -- aren't installed by install-headers, + # so do them by hand. We can tolerate an empty stubs.h for the moment. + # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html + mkdir -p "${CT_HEADERS_DIR}/gnu" + touch "${CT_HEADERS_DIR}/gnu/stubs.h" + cp "${CT_SRC_DIR}/${CT_LIBC_FILE}/include/features.h" "${CT_HEADERS_DIR}/features.h" + + # Building the bootstrap gcc requires either setting inhibit_libc, or + # having a copy of stdio_lim.h... see + # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html + cp bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h" + + # Following error building gcc-4.0.0's gcj: + # error: bits/syscall.h: No such file or directory + # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html + # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html + [ "${CT_ARCH}" != "arm" ] && cp misc/syscall-list.h "${CT_HEADERS_DIR}/bits/syscall.h" || true + + CT_EndStep +} + +# This function builds and install the full glibc +do_libc() { + CT_DoStep INFO "Installing C library" + + mkdir -p "${CT_BUILD_DIR}/build-libc" + cd "${CT_BUILD_DIR}/build-libc" + + CT_DoLog EXTRA "Configuring C library" + + # Add some default glibc config options if not given by user. + extra_config="" + case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in + *enable-kernel*) ;; + *) extra_config="${extra_config} --enable-kernel=${CT_KERNEL_VERSION}" + esac + case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in + *-tls*) ;; + *) extra_config="${extra_config} --without-tls" + esac + case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in + *-__thread*) ;; + *) extra_config="${extra_config} --without-__thread" + esac + case "${CT_SHARED_LIBS}" in + y) extra_config="${extra_config} --enable-shared";; + *) extra_config="${extra_config} --disable-shared";; + esac + case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in + *--with-fp*) ;; + *--without-fp*) ;; + *) case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in + y,) extra_config="${extra_config} --with-fp";; + ,y) extra_config="${extra_config} --without-fp";; + esac;; + esac + case "${CT_LIBC_ADDONS},${CT_LIBC_ADDONS_LIST}" in + y,) extra_config="${extra_config} --enable-add-ons";; + y,*) extra_config="${extra_config} --enable-add-ons=${CT_LIBC_ADDONS_LIST}";; + esac + + CT_DoLog DEBUG "Extra config args passed: \"${extra_config}\"" + + # Add some default CC args + extra_cc_args= + case "${CT_LIBC_EXTRA_CC_ARGS}" in + *-mbig-endian*) ;; + *-mlittle-endian*) ;; + *) case "${CT_ARCH_BE},${CT_ARCH_LE}" in + y,) extra_cc_args="${extra_cc_args} -mbig-endian";; + ,y) extra_cc_args="${extra_cc_args} -mlittle-endian";; + esac;; + esac + + CT_DoLog DEBUG "Extra CC args passed: \"${extra_cc_args}\"" + + # sh3 and sh4 really need to set configparms as of gcc-3.4/glibc-2.3.2 + # note: this is awkward, doesn't work well if you need more than one line in configparms + echo ${CT_LIBC_GLIBC_CONFIGPARMS} > configparms + + # For glibc 2.3.4 and later we need to set some autoconf cache + # variables, because nptl/sysdeps/pthread/configure.in does not + # work when cross-compiling. + if test -d ${GLIBC_DIR}/nptl; then + libc_cv_forced_unwind=yes + libc_cv_c_cleanup=yes + export libc_cv_forced_unwind libc_cv_c_cleanup + fi + + # Configure with --prefix the way we want it on the target... + # There are a whole lot of settings here. You'll probably want + # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG + # Compare these options with the ones used when installing the glibc headers above - they're different. + # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" + # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. + # Set BUILD_CC, or you won't be able to build datafiles + # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs + + BUILD_CC=${CT_CC_NATIVE} \ + CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O" \ + CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \ + AR=${CT_TARGET}-ar \ + RANLIB=${CT_TARGET}-ranlib \ + "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \ + --prefix=/usr \ + --build=${CT_BUILD} --host=${CT_TARGET} \ + ${CT_LIBC_GLIBC_EXTRA_CONFIG} \ + ${extra_config} \ + --without-cvs \ + --disable-profile \ + --disable-debug \ + --without-gd \ + --with-headers="${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG + + if grep -l '^install-lib-all:' "${CT_SRC_DIR}/${CT_LIBC_FILE}/Makerules" > /dev/null; then + # nptl-era glibc. + # If the install-lib-all target (which is added by our make-install-lib-all.patch) + # is present, it means we're building glibc-2.3.3 or later, and we can't + # build programs yet, as they require libeh, which won't be installed + # until full build of gcc + GLIBC_INITIAL_BUILD_RULE=lib + GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers" + GLIBC_INSTALL_APPS_LATER=yes + else + # classic glibc. + # We can build and install everything with the bootstrap compiler. + GLIBC_INITIAL_BUILD_RULE=all + GLIBC_INITIAL_INSTALL_RULE=install + GLIBC_INSTALL_APPS_LATER=no + fi + + # If this fails with an error like this: + # ... linux/autoconf.h: No such file or directory + # then you need to set the KERNELCONFIG variable to point to a .config file for this arch. + # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc + # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx + # No need for PARALLELMFLAGS here, Makefile already reads this environment variable + CT_DoLog EXTRA "Building C library" + make LD=${CT_TARGET}-ld \ + RANLIB=${CT_TARGET}-ranlib \ + ${GLIBC_INITIAL_BUILD_RULE} 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing C library" + make install_root="${CT_SYSROOT_DIR}" \ + ${LIBC_SYSROOT_ARG} \ + ${GLIBC_INITIAL_INSTALL_RULE} 2>&1 |CT_DoLog DEBUG + + # This doesn't seem to work when building a crosscompiler, + # as it tries to execute localedef using the just-built ld.so!? + #CT_DoLog EXTRA "Installing locales" + #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog DEBUG + + # Fix problems in linker scripts. + # + # 1. Remove absolute paths + # Any file in a list of known suspects that isn't a symlink is assumed to be a linker script. + # FIXME: test -h is not portable + # FIXME: probably need to check more files than just these three... + # Need to use sed instead of just assuming we know what's in libc.so because otherwise alpha breaks + # + # 2. Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html, + # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm + # + # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig + CT_DoLog EXTRA "Fixing C library linker scripts" + for file in libc.so libpthread.so libgcc_s.so; do + for dir in lib lib64 usr/lib usr/lib64; do + if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then + mv "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig" + CT_DoLog DEBUG "Fixing \"${CT_SYS_ROOT_DIR}/${dir}/${file}\"" + sed -i -r -e 's,/usr/lib/,,g; + s,/usr/lib64/,,g; + s,/lib/,,g; + s,/lib64/,,g; + /BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}_orig" + fi + done + done + + CT_EndStep +} + +# This function finishes the glibc install +do_libc_finish() { + # Finally, build and install glibc programs, now that libeh (if any) is installed + # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with + # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info' + # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info' + [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0 + + CT_DoStep INFO "Finishing C library" + + cd "${CT_BUILD_DIR}/build-libc" + + CT_DoLog EXTRA "Re-building C library" + make LD=${CT_TARGET}-ld RANLIB=${CT_TARGET}-ranlib 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing missing C library components" + # note: should do full install and then fix linker scripts, but this is faster + for t in bin rootsbin sbin data others; do + make install_root="${CT_SYSROOT_DIR}" \ + ${LIBC_SYSROOT_ARG} \ + install-${t} 2>&1 |CT_DoLog DEBUG + done +} diff --git a/scripts/build/libc_libfloat.sh b/scripts/build/libc_libfloat.sh new file mode 100644 index 0000000..3828a3f --- /dev/null +++ b/scripts/build/libc_libfloat.sh @@ -0,0 +1,31 @@ +# This file adds functions to build libfloat +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +do_libfloat() { + # Here we build and install libfloat for the target, so that the C library + # builds OK with those versions of gcc that have severed softfloat support + # code + [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] || return 0 + CT_DoStep INFO "Installing software floating point emulation library libfloat" + + CT_Pushd "${CT_BUILD_DIR}" + CT_DoLog EXTRA "Copying sources to build dir" + mkdir build-libfloat + cd build-libfloat + ( cd "${CT_SRC_DIR}/${CT_LIBFLOAT_FILE}"; tar cf - . ) |tar xvf - |CT_DoLog DEBUG + + CT_DoLog EXTRA "Cleaning library" + make clean 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Building library" + make CROSS_COMPILE="${CT_CC_CORE_PREFIX_DIR}/bin/${CT_TARGET}-" 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing library" + make CROSS_COMPILE="${CT_CC_CORE_PREFIX_DIR}/bin/${CT_TARGET}-" \ + DESTDIR="${CT_SYSROOT_DIR}" install 2>&1 |CT_DoLog DEBUG + + CT_Popd + + CT_EndStep +} diff --git a/scripts/build/libc_uClibc.sh b/scripts/build/libc_uClibc.sh new file mode 100644 index 0000000..171736d --- /dev/null +++ b/scripts/build/libc_uClibc.sh @@ -0,0 +1,235 @@ +# This file declares functions to install the uClibc C library +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + + +# Check that uClibc has been previously configured +do_libc_check_config() { + CT_DoStep INFO "Checking C library configuration" + + CT_TestOrAbort "You did not provide a uClibc config file!" -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" -a -f "${CT_LIBC_UCLIBC_CONFIG_FILE}" + + cp "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_BUILD_DIR}/uClibc.config" + + if egrep '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then + CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad." + CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade." + fi + + CT_DoLog EXTRA "Munging uClibc configuration" + mungeuClibcConfig "${CT_BUILD_DIR}/uClibc.config" + + CT_EndStep +} + +# This functions installs uClibc's headers +do_libc_headers() { + # Only need to install bootstrap uClibc headers for gcc-3.0 and above? Or maybe just gcc-3.3 and above? + # See also http://gcc.gnu.org/PR8180, which complains about the need for this step. + grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/ChangeLog" || return 0 + + CT_DoStep INFO "Installing C library headers" + + mkdir -p "${CT_BUILD_DIR}/build-libc-headers" + cd "${CT_BUILD_DIR}/build-libc-headers" + + # Simply copy files until uClibc has the ablity to build out-of-tree + CT_DoLog EXTRA "Copying sources to build dir" + { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf - + + # Retrieve the config file + cp "${CT_BUILD_DIR}/uClibc.config" .config + + # uClibc uses the CROSS environment variable as a prefix to the + # compiler tools to use. Setting it to the empty string forces + # use of the native build host tools, which we need at this + # stage, as we don't have target tools yet. + CT_DoLog EXTRA "Applying configuration" + CT_DoYes "" |make CROSS= PREFIX="${CT_SYSROOT_DIR}/" oldconfig 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Building headers" + make ${PARALLELMFLAGS} CROSS= PREFIX="${CT_SYSROOT_DIR}/" headers 2>&1 |CT_DoLog DEBUG + + CT_DoLog EXTRA "Installing headers" + make CROSS= PREFIX="${CT_SYSROOT_DIR}/" install_dev 2>&1 |CT_DoLog DEBUG + + CT_EndStep +} + +# This function build and install the full uClibc +do_libc() { + CT_DoStep INFO "Installing C library" + + mkdir -p "${CT_BUILD_DIR}/build-libc" + cd "${CT_BUILD_DIR}/build-libc" + + # Simply copy files until uClibc has the ablity to build out-of-tree + CT_DoLog EXTRA "Copying sources to build dir" + { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf - + + # Retrieve the config file + cp "${CT_BUILD_DIR}/uClibc.config" .config + + # uClibc uses the CROSS environment variable as a prefix to the compiler + # tools to use. The newly built tools should be in our path, so we need + # only give the correct name for them. + # Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak, + # depending on the configuration of the library. That is, they are tailored + # to best fit the target. So it is useless and seems to be a bad thing to + # use LIBC_EXTRA_CFLAGS here. + CT_DoLog EXTRA "Applying configuration" + CT_DoYes "" |make ${PARALLELMFLAGS} \ + CROSS=${CT_TARGET}- \ + PREFIX="${CT_SYSROOT_DIR}/" \ + oldconfig 2>&1 |CT_DoLog DEBUG + + # We do _not_ want to strip anything for now, in case we specifically + # asked for a debug toolchain, thus the STRIPTOOL= assignment + CT_DoLog EXTRA "Building C library" + make ${PARALLELMFLAGS} \ + CROSS=${CT_TARGET}- \ + PREFIX="${CT_SYSROOT_DIR}/" \ + STRIPTOOL=true \ + all 2>&1 |CT_DoLog DEBUG + + # YEM-FIXME: we want to install libraries in $SYSROOT/lib, but we don't want + # to install headers in $SYSROOT/include, thus making only install_runtime. + # Plus, the headers were previously installed earlier with install_dev, so + # all should be well. Unfortunately, the install_dev target does not install + # crti.o and consorts... :-( So reverting to target 'install'. + # Note: PARALLELMFLAGS is not usefull for installation. + # We do _not_ want to strip anything for now, in case we specifically + # asked for a debug toolchain, thus the STRIPTOOL= assignment + CT_DoLog EXTRA "Installing C library" + make CROSS=${CT_TARGET}- \ + PREFIX="${CT_SYSROOT_DIR}/" \ + STRIPTOOL=true \ + install 2>&1 |CT_DoLog DEBUG + + CT_EndStep +} + +# This function is used to install those components needing the final C compiler +do_libc_finish() { + CT_DoStep INFO "Finishing C library" + # uClibc has nothing to finish + CT_DoLog EXTRA "uClibc has nothing to finish" + CT_EndStep +} + +# Initialises the .config file to sensible values +mungeuClibcConfig() { + config_file="$1" + munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed" + + cat > "${munge_file}" <<-ENDSED +s/^(TARGET_.*)=y$/# \\1 is not set/ +s/^# TARGET_${CT_KERNEL_ARCH} is not set/TARGET_${CT_KERNEL_ARCH}=y/ +s/^TARGET_ARCH=".*"/TARGET_ARCH="${CT_KERNEL_ARCH}"/ +ENDSED + + case "${CT_ARCH_BE},${CT_ARCH_LE}" in + y,) cat >> "${munge_file}" <<-ENDSED +s/.*(ARCH_BIG_ENDIAN).*/\\1=y/ +s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/ +ENDSED + ;; + ,y) cat >> "${munge_file}" <<-ENDSED +s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/ +s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/ +ENDSED + ;; + esac + + case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in + y,) cat >> "${munge_file}" <<-ENDSED +s/.*(HAS_FPU).*/\\1=y/ +ENDSED + ;; + ,y) cat >> "${munge_file}" <<-ENDSED +s/.*(HAS_FPU).*/\\# \\1 is not set/ +ENDSED + ;; + esac + + # Change paths to work with crosstool + # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev + # " we just want the kernel headers, not the whole kernel source ... + # " so people may need to update their paths slightly + quoted_kernel_source=`echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\\\/,g;'` + quoted_headers_dir=`echo ${CT_HEADERS_DIR} | sed -r -e 's,/,\\\\/,g;'` + # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line + # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET} + # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and + # newer versions use KERNEL_HEADERS (which is right). See: + cat >> "${munge_file}" <<-ENDSED +s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/ +s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/ +s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/ +s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/ +s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/ +s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/ +ENDSED + + # Hack our -pipe into WARNINGS, which will be internally incorporated to + # CFLAGS. This a dirty hack, but yet needed + if [ "${CT_USE_PIPES}" = "y" ]; then + cat >> "${munge_file}" <<-ENDSED +s/^(WARNINGS=".*)"$/\\1 -pipe"/ +ENDSED + fi + + # Force on options needed for C++ if we'll be making a C++ compiler. + # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing + # entirely if LOCALE is not set. If LOCALE was already set, we'll + # assume the user has already made all the appropriate generation + # arrangements. Note that having the uClibc Makefile download the + # pregenerated locales is not compatible with crosstool; besides, + # crosstool downloads them as part of getandpatch.sh. + if [ "${CT_CC_LANG_CXX}" = "y" ]; then + cat >> "${munge_file}" <<-ENDSED +s/^# DO_C99_MATH is not set/DO_C99_MATH=y/ +s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/ +# Add these three lines when doing C++? +#s/^# UCLIBC_HAS_WCHAR is not set/UCLIBC_HAS_WCHAR=y/ +#s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\nUCLIBC_PREGENERATED_LOCALE_DATA=y\\n\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\n\\# UCLIBC_HAS_XLOCALE is not set/ +#s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/ +ENDSED + fi + + # Force on debug options if asked for + case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in + 0) + cat >>"${munge_file}" <<-ENDSED +s/^PTHREADS_DEBUG_SUPPORT=y/# PTHREADS_DEBUG_SUPPORT is not set/ +s/^DODEBUG=y/# DODEBUG is not set/ +s/^DODEBUG_PT=y/# DODEBUG_PT is not set/ +s/^DOASSERTS=y/# DOASSERTS is not set/ +s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/ +s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/ +ENDSED + ;; + 1) + cat >>"${munge_file}" <<-ENDSED +s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/ +s/^# DODEBUG is not set.*/DODEBUG=y/ +s/^DODEBUG_PT=y/# DODEBUG_PT is not set/ +s/^DOASSERTS=y/# DOASSERTS is not set/ +s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/ +s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/ +ENDSED + ;; + 2) + cat >>"${munge_file}" <<-ENDSED +s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/ +s/^# DODEBUG is not set.*/DODEBUG=y/ +s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/ +s/^# DOASSERTS is not set.*/DOASSERTS=y/ +s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/ +s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/ +ENDSED + ;; + esac + sed -r -i -f "${munge_file}" "${config_file}" + rm -f "${munge_file}" +} diff --git a/scripts/buildToolchain.sh b/scripts/buildToolchain.sh new file mode 100644 index 0000000..dff1f6f --- /dev/null +++ b/scripts/buildToolchain.sh @@ -0,0 +1,123 @@ +# This scripts calls each component's build script. +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +# Parse all build files to have the needed functions. +. "${CT_TOP_DIR}/scripts/build/kernel_${CT_KERNEL}.sh" +. "${CT_TOP_DIR}/scripts/build/binutils.sh" +. "${CT_TOP_DIR}/scripts/build/libc_libfloat.sh" +. "${CT_TOP_DIR}/scripts/build/libc_${CT_LIBC}.sh" +. "${CT_TOP_DIR}/scripts/build/cc_core_${CT_CC_CORE}.sh" +. "${CT_TOP_DIR}/scripts/build/cc_${CT_CC}.sh" + +# Arrange paths depending on wether we use sys-root or not. +if [ "${CT_USE_SYSROOT}" = "y" ]; then + CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/sys-root" + CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include" + BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" + CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" + CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" + LIBC_SYSROOT_ARG="" + # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get + # confused when $sysroot/usr/include is not present. + # Note: --prefix=/usr is magic! + # See http://www.gnu.org/software/libc/FAQ.html#s-2.2 +else + # plain old way. All libraries in prefix/target/lib + CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}" + CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include" + # hack! Always use --with-sysroot for binutils. + # binutils 2.14 and later obey it, older binutils ignore it. + # Lets you build a working 32->64 bit cross gcc + BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" + # Use --with-headers, else final gcc will define disable_glibc while + # building libgcc, and you'll have no profiling + CC_CORE_SYSROOT_ARG="--without-headers" + CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}" + LIBC_SYSROOT_ARG="prefix=" +fi + +# Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by +# 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail with +# "ld: cannot open crti.o: No such file or directory" +mkdir -p "${CT_SYSROOT_DIR}/lib" +mkdir -p "${CT_SYSROOT_DIR}/usr/lib" + +# Canadian-cross are really picky on the way they are built. Tweak the values. +if [ "${CT_CANADIAN}" = "y" ]; then + # Arrange so that gcc never, ever think that build system == host system + CT_CANADIAN_OPT="--build=`echo \"${CT_BUILD}\" |sed -r -e 's/-/-build_/'`" + # We shall have a compiler for this target! + # Do test here... +else + CT_HOST="${CT_BUILD}" + CT_CANADIAN_OPT= + # Add the target toolchain in the path so that we can build the C library + export PATH="${CT_PREFIX_DIR}/bin:${CT_CC_CORE_PREFIX_DIR}/bin:${PATH}" +fi + +# Modify GCC_HOST to never be equal to $BUILD or $TARGET +# This strange operation causes gcc to always generate a cross-compiler +# even if the build machine is the same kind as the host. +# This is why CC has to be set when doing a canadian cross; you can't find a +# host compiler by appending -gcc to our whacky $GCC_HOST +# Kludge: it is reported that the above causes canadian crosses with cygwin +# hosts to fail, so avoid it just in that one case. It would be cleaner to +# just move this into the non-canadian case above, but I'm afraid that might +# cause some configure script somewhere to decide that since build==host, they +# could run host binaries. +# (Copied almost as-is from original crosstool): +case "${CT_KERNEL},${CT_CANADIAN}" in + cygwin,y) ;; + *) CT_HOST="`echo \"${CT_HOST}\" |sed -r -e 's/-/-host_/;'`";; +esac + +# Ha. cygwin host have an .exe suffix (extension) for executables. +[ "${CT_KERNEL}" = "cygwin" ] && EXEEXT=".exe" || EXEEXT="" + +# Transform the ARCH into a kernel-understandable ARCH +case "${CT_ARCH}" in + x86) CT_KERNEL_ARCH=i386;; + ppc) CT_KERNL_ARCH=powerpc;; + *) CT_KERNEL_ARCH="${CT_ARCH}";; +esac + +# Build up the TARGET_CFLAGS from user-provided options +tmp_target_CFLAGS= +[ -n "${CT_ARCH_CPU}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mcpu=${CT_ARCH_CPU}" +[ -n "${CT_ARCH_TUNE}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mtune=${CT_ARCH_TUNE}" +[ -n "${CT_ARCH_ARCH}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -march=${CT_ARCH_ARCH}" +[ -n "${CT_ARCH_FPU}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mfpu=${CT_ARCH_FPU}" +# Override with user-specified CFLAGS +CT_TARGET_CFLAGS="${tmp_target_CFLAGS} ${CT_TARGET_CFLAGS}" + +# Help gcc +CT_CFLAGS_FOR_HOST= +[ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe" + +# And help make go faster +PARALLELMFLAGS= +[ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}" +[ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}" + +CT_DoStep EXTRA "Dumping internal crosstool-NG configuration" +CT_DoLog EXTRA "Building a toolchain for :" +CT_DoLog EXTRA " build = ${CT_BUILD}" +CT_DoLog EXTRA " host = ${CT_HOST}" +CT_DoLog EXTRA " target = ${CT_TARGET}" +set |egrep '^CT_.+=' |sort |CT_DoLog DEBUG +CT_EndStep + +# Now for the job by itself. +# Check the C library config ASAP, before the user gets bored, and is +# gone having his/her coffee +do_libc_check_config +do_kernel_check_config +do_kernel_headers +do_binutils +do_libc_headers +do_cc_core +do_libfloat +do_libc +do_cc +do_libc_finish diff --git a/scripts/crosstool.sh b/scripts/crosstool.sh new file mode 100755 index 0000000..48ddca2 --- /dev/null +++ b/scripts/crosstool.sh @@ -0,0 +1,273 @@ +#!/bin/bash +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package. + +# This is the main entry point to crosstool +# This will: +# - download, extract and patch the toolchain components +# - build and install each components in turn +# - and eventually test the resulting toolchain + +# What this file does is prepare the environment, based upon the user-choosen +# options. It also checks the existing environment for un-friendly variables, +# and checks for needed tools. It eventually calls the main build script. + +# User must set CT_TOP_DIR in is environment! +# Once we can build out-of-tree, then this will have to go. +if [ -z "${CT_TOP_DIR}" -o ! -d "${CT_TOP_DIR}" ]; then + # We don't have the functions right now, because we don't have CT_TOP_DIR. + # Do the print stuff by hand: + echo "CT_TOP_DIR not set. You must set CT_TOP_DIR to the top directory where crosstool is installed." + exit 1 +fi + +# Parse the common functions +. "${CT_TOP_DIR}/scripts/functions" + +CT_STAR_DATE=`CT_DoDate +%s%N` +CT_STAR_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S` + +# Log to a temporary file until we have built our environment +CT_ACTUAL_LOG_FILE="`pwd`/$$.log" + +# CT_TOP_DIR should be an absolute path. +CT_TOP_DIR="`CT_MakeAbsolutePath \"${CT_TOP_DIR}\"`" + +# Parse the configuration file +CT_TestOrAbort "Configuration file not found. Please create one." -f "${CT_TOP_DIR}/.config" +. "${CT_TOP_DIR}/.config" + +# The progress bar indicator is asked for +if [ "${CT_LOG_PROGRESS_BAR}" = "y" ]; then + _CT_PROG_BAR() { + [ $((cpt/5)) -eq 0 ] && echo -en "/" + [ $((cpt/5)) -eq 1 ] && echo -en "-" + [ $((cpt/5)) -eq 2 ] && echo -en "\\" + [ $((cpt/5)) -eq 3 ] && echo -en "|" + echo -en "\r" + cpt=$(((cpt+1)%20)) + } + CT_PROG_BAR=_CT_PROG_BAR + export -f _CT_PROG_BAR +else + CT_PROG_BAR= +fi + +# Apply the color scheme if needed +if [ "${CT_LOG_USE_COLORS}" = "y" ]; then + CT_ERROR_COLOR="${_A_NOR}${_A_BRI}${_F_RED}" + CT_WARN_COLOR="${_A_NOR}${_A_BRI}${_F_YEL}" + CT_INFO_COLOR="${_A_NOR}${_A_BRI}${_F_GRN}" + CT_EXTRA_COLOR="${_A_NOR}${_A_DIM}${_F_GRN}" + CT_DEBUG_COLOR="${_A_NOR}${_A_DIM}${_F_WHI}" + CT_NORMAL_COLOR="${_A_NOR}" +else + CT_ERROR_COLOR= + CT_WARN_COLOR= + CT_INFO_COLOR= + CT_EXTRA_COLOR= + CT_DEBUG_COLOR= + CT_NORMAL_COLOR= +fi + +# Yes! We can do full logging from now on! +CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}" + +# Some sanity checks in the environment and needed tools +CT_DoLog INFO "Checking environment sanity" + +# Enable known ordering of files in directory listings: +CT_Test "Crosstool-NG might not work as expected with LANG=\"${LANG}\"" -n "${LANG}" +case "${LC_COLLATE},${LC_ALL}" in + # These four combinations are known to sort files in the correct order: + fr_FR*,) ;; + en_US*,) ;; + *,fr_FR*) ;; + *,en_US*) ;; + # Anything else is destined to be borked if not gracefuly handled: + *) CT_DoLog WARN "Either LC_COLLATE=\"${LC_COLLATE}\" or LC_ALL=\"${LC_ALL}\" is not supported." + export LC_ALL=`locale -a |egrep "^(fr_FR|en_US)" |head -n 1` + CT_TestOrAbort "Neither en_US* nor fr_FR* locales found on your system." -n "${LC_ALL}" + CT_DoLog WARN "Forcing to known working LC_ALL=\"${LC_ALL}\"." + ;; +esac + +# Other environment sanity checks +CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}" +CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}" +CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}" +CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}" +GREP_OPTIONS= +CT_HasOrAbort awk +CT_HasOrAbort sed +CT_HasOrAbort bison +CT_HasOrAbort flex + +CT_DoStep DEBUG "Dumping crosstool-NG configuration" +cat ${CT_TOP_DIR}/.config |egrep '^(# |)CT_' |CT_DoLog DEBUG +CT_EndStep + +CT_DoLog INFO "Building environment variables" + +# This should go in buildToolchain.sh, but we might need it because it could +# be used by the user in his/her paths definitions. +# Target triplet: CT_TARGET needs a little love: +case "${CT_ARCH_BE},${CT_ARCH_LE}" in + y,) target_endian_eb=eb; target_endian_el=;; + ,y) target_endian_eb=; target_endian_el=el;; +esac +case "${CT_ARCH}" in + arm) CT_TARGET="${CT_ARCH}${target_endian_eb}";; + mips) CT_TARGET="${CT_ARCH}${target_endian_el}";; + x86*) # Much love for this one :-( + # Ultimately, we should use config.sub to output the correct + # procesor name. Work for later... + arch="${CT_ARCH_ARCH}" + [ -z "${arch}" ] && arch="${CT_ARCH_TUNE}" + case "${CT_ARCH}" in + x86_64) CT_TARGET=x86_64;; + *) case "${arch}" in + "") CT_TARGET=i386;; + i386|i486|i586|i686) CT_TARGET="${arch}";; + winchip*) CT_TARGET=i486;; + pentium|pentium-mmx|c3*) CT_TARGET=i586;; + nocona|athlon*64|k8|athlon-fx|opteron) CT_TARGET=x86_64;; + pentiumpro|pentium*|athlon*) CT_TARGET=i686;; + *) CT_TARGET=i586;; + esac;; + esac;; +esac +case "${CT_TARGET_VENDOR}" in + "") CT_TARGET="${CT_TARGET}-unknown";; + *) CT_TARGET="${CT_TARGET}-${CT_TARGET_VENDOR}";; +esac +case "${CT_KERNEL}" in + linux*) CT_TARGET="${CT_TARGET}-linux";; + cygwin*) CT_TARGET="${CT_TARGET}-cygwin";; +esac +case "${CT_LIBC}" in + glibc) CT_TARGET="${CT_TARGET}-gnu";; + uClibc) CT_TARGET="${CT_TARGET}-uclibc";; +esac +CT_TARGET="`${CT_TOP_DIR}/tools/config.sub ${CT_TARGET}`" + +# Now, build up the variables from the user-configured options. +CT_KERNEL_FILE="${CT_KERNEL}-${CT_KERNEL_VERSION}" +CT_BINUTILS_FILE="binutils-${CT_BINUTILS_VERSION}" +if [ "${CT_CC_USE_CORE}" != "y" ]; then + CT_CC_CORE="${CT_CC}" + CT_CC_CORE_VERSION="${CT_CC_VERSION}" + CT_CC_CORE_EXTRA_CONFIG="${CT_CC_EXTRA_CONFIG}" +fi +CT_CC_CORE_FILE="${CT_CC_CORE}-${CT_CC_CORE_VERSION}" +CT_CC_FILE="${CT_CC}-${CT_CC_VERSION}" +CT_LIBC_FILE="${CT_LIBC}-${CT_LIBC_VERSION}" +[ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] && CT_LIBFLOAT_FILE="libfloat-990616" + +# Kludge: If any of the configured options needs CT_TARGET or CT_TOP_DIR, +# then rescan the options file now: +. "${CT_TOP_DIR}/.config" + +# Determine build system if not set by the user +CT_Test "You did not specify the build system. Guessing." -z "${CT_BUILD}" +CT_BUILD="`${CT_TOP_DIR}/tools/config.sub \"${CT_BUILD:-\`${CT_TOP_DIR}/tools/config.guess\`}\"`" + +# Get rid of pre-existing installed toolchain and previous build directories. +# We need to do that _before_ we can safely log, because the log file will +# most probably be in the toolchain directory. +if [ -d "${CT_PREFIX_DIR}" ]; then + mv "${CT_PREFIX_DIR}" "${CT_PREFIX_DIR}.$$" + nohup rm -rf "${CT_PREFIX_DIR}.$$" >/dev/null 2>&1 & +fi +mkdir -p "${CT_PREFIX_DIR}" +if [ -d "${CT_BUILD_DIR}" ]; then + mv "${CT_BUILD_DIR}" "${CT_BUILD_DIR}.$$" + nohup rm -rf "${CT_BUILD_DIR}.$$" >/dev/null 2>&1 & +fi +mkdir -p "${CT_BUILD_DIR}" + +# Check now if we can write to the destination directory: +if [ -d "${CT_PREFIX_DIR}" ]; then + CT_TestAndAbort "Destination directory \"${CT_INSTALL_DIR}\" is not writeable" ! -w "${CT_PREFIX_DIR}" +else + mkdir -p "${CT_PREFIX_DIR}" || CT_Abort "Could not create destination directory \"${CT_PREFIX_DIR}\"" +fi + +# Redirect log to the actual log file now we can +# It's quite understandable that the log file will be installed in the +# install directory, so we must first ensure it exists and is writeable (above) +# before we can log there +t="${CT_ACTUAL_LOG_FILE}" +case "${CT_LOG_TO_FILE},${CT_LOG_FILE}" in + ,*) CT_ACTUAL_LOG_FILE=/dev/null + rm -f "${t}" + ;; + y,/*) mkdir -p "`dirname \"${CT_LOG_FILE}\"`" + CT_ACTUAL_LOG_FILE="${CT_LOG_FILE}" + mv "${t}" "${CT_ACTUAL_LOG_FILE}" + ;; + y,*) mkdir -p "`pwd`/`dirname \"${CT_LOG_FILE}\"`" + CT_ACTUAL_LOG_FILE="`pwd`/${CT_LOG_FILE}" + mv "${t}" "${CT_ACTUAL_LOG_FILE}" + ;; +esac + +# Some more sanity checks now that we have all paths set up +case "${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in + *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";; +esac + +# Note: we'll always install the core compiler in its own directory, so as to +# not mix the two builds: core and final. Anyway, its generic, wether we use +# a different compiler as core, or not. +CT_CC_CORE_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core" + +# Good, now grab a bit of informations on the system we're being run, +# just in case something goes awok, and it's not our fault: +CT_SYS_HOSTNAME=`hostname -f 2>/dev/null || true` +# Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name. +CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-`uname -n`}" +CT_SYS_KERNEL=`uname -s` +CT_SYS_REVISION=`uname -r` +# MacOS X lacks '-o' : +CT_SYS_OS=`uname -o || echo Unkown` +CT_SYS_MACHINE=`uname -m` +CT_SYS_PROCESSOR=`uname -p` +CT_SYS_USER="`id -un`" +CT_SYS_DATE=`CT_DoDate +%Y%m%d.%H%M%S` +CT_SYS_GCC=`gcc -dumpversion` +CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_SYS_DATE} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME} for ${CT_TARGET}" + +# renice oursleves +renice ${CT_NICE} $$ |CT_DoLog DEBUG + +# Include sub-scripts instead of calling them: that way, we do not have to +# export any variable, nor re-parse the configuration and functions files. +. "${CT_TOP_DIR}/scripts/getExtractPatch.sh" +. "${CT_TOP_DIR}/scripts/buildToolchain.sh" +#. "${CT_TOP_DIR}/scripts/testToolchain.sh" + +if [ -n "${CT_TARGET_ALIAS}" ]; then + CT_DoLog EXTRA "Creating symlinks from \"${CT_TARGET}-*\" to \"${CT_TARGET_ALIAS}-*\"" + CT_Pushd "${CT_PREFIX_DIR}/bin" + for t in "${CT_TARGET}-"*; do + _t="`echo \"$t\" |sed -r -e 's/^'\"${CT_TARGET}\"'-/'\"${CT_TARGET_ALIAS}\"'-/;'`" + CT_DoLog DEBUG "Linking \"${_t}\" -> \"${t}\"" + ln -s "${t}" "${_t}" + done + CT_Popd +fi + +CT_STOP_DATE=`CT_DoDate +%s%N` +CT_STOP_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S` +CT_DoLog INFO "Build completed at ${CT_STOP_DATE_HUMAN}" +elapsed=$((CT_STOP_DATE-CT_STAR_DATE)) +elapsed_min=$((elapsed/(60*1000*1000*1000))) +elapsed_sec=`printf "%02d" $(((elapsed%(60*1000*1000*1000))/(1000*1000*1000)))` +elapsed_csec=`printf "%02d" $(((elapsed%(1000*1000*1000))/(10*1000*1000)))` +CT_DoLog INFO "(elapsed: ${elapsed_min}:${elapsed_sec}.${elapsed_csec})" + +# Restore a 'normal' color setting +echo -en "${CT_NORMAL_COLOR}" + +trap - EXIT diff --git a/scripts/functions b/scripts/functions new file mode 100644 index 0000000..2e7859d --- /dev/null +++ b/scripts/functions @@ -0,0 +1,215 @@ +# This file contains some usefull common functions +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +CT_OnError() { + ret=$? + CT_DoLog ERROR "Build failed in step \"${CT_STEP_MESSAGE[${CT_STEP_COUNT}]}\"" + for((step=(CT_STEP_COUNT-1); step>1; step--)); do + CT_DoLog ERROR " called in step \"${CT_STEP_MESSAGE[${step}]}\"" + done + CT_DoLog ERROR "Error happened in \"${BASH_SOURCE[1]}\" in function \"${FUNCNAME[1]}\" (line unknown, sorry)" + for((depth=2; ${BASH_LINENO[$((${depth}-1))]}>0; depth++)); do + CT_DoLog ERROR " called from \"${BASH_SOURCE[${depth}]}\" at line # ${BASH_LINENO[${depth}-1]} in function \"${FUNCNAME[${depth}]}\"" + done + CT_DoLog ERROR "Look at \"${CT_ACTUAL_LOG_FILE}\" for more info on this error." + exit $ret +} +trap CT_OnError ERR + +set -E +set -o pipefail + +# This is crosstool-ng-0.0.1 +CT_VERSION=ng-0.0.1 + +# The different log levels: +CT_LOG_LEVEL_ERROR=0 +CT_LOG_LEVEL_WARN=1 +CT_LOG_LEVEL_INFO=2 +CT_LOG_LEVEL_EXTRA=3 +CT_LOG_LEVEL_DEBUG=4 + +# Attributes +_A_NOR="\\033[0m" +_A_BRI="\\033[1m" +_A_DIM="\\033[2m" +_A_UND="\\033[4m" +_A_BRB="\\033[5m" +_A_REV="\\033[7m" +_A_HID="\\033[8m" + +# Fore colors +_F_BLK="\\033[30m" +_F_RED="\\033[31m" +_F_GRN="\\033[32m" +_F_YEL="\\033[33m" +_F_BLU="\\033[34m" +_F_MAG="\\033[35m" +_F_CYA="\\033[36m" +_F_WHI="\\033[37m" + +# A function to log what is happening +# Different log level are available: +# - ERROR: A serious, fatal error occurred +# - WARN: A non fatal, non serious error occurred, take your responsbility with the generated build +# - INFO: Informational messages +# - EXTRA: Extra informational messages +# - DEBUG: Debug messages +# Usage: CT_DoLog [message] +# If message is empty, then stdin will be logged. +CT_DoLog() { + local max_level + local level + eval max_level="\${CT_LOG_LEVEL_${CT_LOG_LEVEL_MAX}}" + # Set the maximum log level to DEBUG if we have none + [ -z ${max_level} ] && max_level=${CT_LOG_LEVEL_DEBUG} + + local LEVEL="$1" + shift + eval level="\${CT_LOG_LEVEL_${LEVEL}}" + + if [ $# -eq 0 ]; then + cat - + else + echo "${1}" + fi |( IFS="\n" # We want the full lines, even leading spaces + cpt=0 + indent=$((2*CT_STEP_COUNT)) + while read line; do + l="`printf \"[%-5s]%*s%s%s\" \"${LEVEL}\" \"${indent}\" \" \" \"${line}\"`" + # There will always be a log file, be it /dev/null + echo -e "${l}" >>"${CT_ACTUAL_LOG_FILE}" + color="CT_${LEVEL}_COLOR" + normal="CT_NORMAL_COLOR" + if [ ${level} -le ${max_level} ]; then + echo -e "${!color}${l}${!normal}" + else + ${CT_PROG_BAR} + fi + done + ) + + return 0 +} + +# Abort the execution with a error message +# Usage: CT_Abort +CT_Abort() { + CT_DoLog ERROR "$1" >&2 + exit 1 +} + +# Test a condition, and print a message if satisfied +# Usage: CT_Test +CT_Test() { + local ret + local m="$1" + shift + test "$@" && CT_DoLog WARN "$m" + return 0 +} + +# Test a condition, and abort with an error message if satisfied +# Usage: CT_TestAndAbort +CT_TestAndAbort() { + local m="$1" + shift + test "$@" && CT_Abort "$m" + return 0 +} + +# Test a condition, and abort with an error message if not satisfied +# Usage: CT_TestAndAbort +CT_TestOrAbort() { + local m="$1" + shift + test "$@" || CT_Abort "$m" + return 0 +} + +# Test the presence of a tool, or abort if not found +# Usage: CT_HasOrAbort +CT_HasOrAbort() { + CT_TestAndAbort "\"${1}\" not found and needed for successfull toolchain build." -z "`which \"${1}\"`" + return 0 +} + +# Get current date with nanosecond precision +# On those system not supporting nanosecond precision, faked with rounding down +# to the highest entire second +# Usage: CT_DoDate +CT_DoDate() { + date "$1" |sed -r -e 's/%N$/000000000/;' +} + +CT_STEP_COUNT=1 +CT_STEP_MESSAGE[${CT_STEP_COUNT}]="" +# Memorise a step being done so that any error is caught +# Usage: CT_DoStep +CT_DoStep() { + local start=`CT_DoDate +%s%N` + CT_DoLog "$1" "=================================================================" + CT_DoLog "$1" "$2" + CT_STEP_COUNT=$((CT_STEP_COUNT+1)) + CT_STEP_LEVEL[${CT_STEP_COUNT}]="$1"; shift + CT_STEP_START[${CT_STEP_COUNT}]="${start}" + CT_STEP_MESSAGE[${CT_STEP_COUNT}]="$1" + return 0 +} + +# End the step just being done +# Usage: CT_EndStep +CT_EndStep() { + local stop=`CT_DoDate +%s%N` + local duration=`printf "%032d" $((stop-${CT_STEP_START[${CT_STEP_COUNT}]})) |sed -r -e 's/([[:digit:]]{2})[[:digit:]]{7}$/\.\1/; s/^0+//; s/^\./0\./;'` + local level="${CT_STEP_LEVEL[${CT_STEP_COUNT}]}" + local message="${CT_STEP_MESSAGE[${CT_STEP_COUNT}]}" + CT_STEP_COUNT=$((CT_STEP_COUNT-1)) + CT_DoLog "${level}" "${message}: done in ${duration}s" + return 0 +} + +# Pushes into a directory, and pops back +CT_Pushd() { + pushd "$1" >/dev/null 2>&1 +} +CT_Popd() { + popd >/dev/null 2>&1 +} + +# Makes a path absolute +# Usage: CT_MakeAbsolutePath path +CT_MakeAbsolutePath() { + # Try to cd in that directory + if [ -d "$1" ]; then + CT_Pushd "$1" + pwd + CT_Popd + else + # No such directory, fail back to guessing + case "$1" in + /*) echo "$1";; + *) echo "`pwd`/$1";; + esac + fi + + return 0 +} + +# Creates a temporary directory +# $1: variable to assign to +# Usage: CT_MktempDir foo +CT_MktempDir() { + # Some mktemp do not allow more than 6 Xs + eval "$1"="`mktemp -q -d \"${CT_BUILD_DIR}/.XXXXXX\"`" + CT_TestOrAbort "Could not make temporary directory" -n "${!1}" -a -d "${!1}" +} + +# Echoes the specified string on stdout until the pipe breaks. +# Doesn't fail +# $1: string to echo +# Usage: CT_DoYes "" |make oldconfig +CT_DoYes() { + yes "$1" || true +} diff --git a/scripts/getExtractPatch.sh b/scripts/getExtractPatch.sh new file mode 100644 index 0000000..ed411b8 --- /dev/null +++ b/scripts/getExtractPatch.sh @@ -0,0 +1,336 @@ +# This script will download tarballs, extract them and patch the source. +# Copyright 2007 Yann E. MORIN +# Licensed under the GPL v2. See COPYING in the root of this package + +# Download tarballs in sequence. Once we have everything, start extracting +# and patching the tarballs. + +#----------------------------------------------------------------------------- + +_wget=`which wget || true` +_curl=`which curl || true` +#_svn=`which svn ||true` +#_cvs=`which cvs || true` + +case "${_wget},${_curl}" in + ,) CT_Abort "Found neither curl nor wget. Please install one.";; + ,*) CT_DoLog DEBUG "Using curl to retrieve tarballs"; CT_DoGetFile=CT_DoGetFileCurl;; + *) CT_DoLog DEBUG "Using wget to retrieve tarballs"; CT_DoGetFile=CT_DoGetFileWget;; +esac + +CT_DoGetFileWget() { + # Need to return true because it is legitimate not to find the tarball at + # some of the provided URLs (think about snapshots, different layouts for + # different gcc versions, etc...) + # Some (very old!) FTP server might not support the passive mode, thus + # retry without + # With automated download as we are doing, it can be very dangerous to use + # -c to continue the downloads. It's far better to simply overwrite the + # destination file + wget -nc --progress=dot:binary --tries=3 --passive-ftp "$1" || wget -nc --progress=dot:binary --tries=3 "$1" || true +} + +CT_DoGetFileCurl() { + # Note: comments about wget method are also valid here + # Plus: no good progreess indicator is available with curl, + # so output is consigned to oblivion + curl --ftp-pasv -O --retry 3 "$1" >/dev/null || curl -O --retry 3 "$1" >/dev/null || true +} + +# For those wanting bleading edge, or to retrieve old uClibc snapshots +# Usage: CT_GetFileSVN basename url +#CT_DoGetFileSVN() { +# local basename="$1" +# local url="`echo \"$2\" |cut -d : -f 2-`" +# local tmp_dir +# +# CT_TestOrAbort "You don't have subversion" -n "${_svn}" +# CT_MktempDir tmp_dir +# CT_Pushd "${tmp_dir}" +# svn export --force "${url}" "${basename}" +# tar cfj "${CT_TARBALLS_DIR}/${basename}.tar.bz2" "${basename}" +# CT_Popd +# rm -rf "${tmp_dir}" +#} +# +#CT_DoGetFileCVS() { +# : +#} + +# Download the file from one of the URLs passed as argument +# Usage: CT_GetFile [ ...] +CT_GetFile() { + local got_it + local ext + local url + local file="$1" + shift + + # Do we already have it? + ext=`CT_GetFileExtension "${file}"` + if [ -n "${ext}" ]; then + if [ "${CT_FORCE_DOWNLOAD}" = "y" ]; then + rm -f "${CT_TARBALLS_DIR}/${file}${ext}" + else + return 0 + fi + fi + + CT_DoLog EXTRA "Retrieving \"${file}\"" + CT_Pushd "${CT_TARBALLS_DIR}" + # File not yet downloaded, try to get it + got_it=0 + if [ "${got_it}" != "y" ]; then + # We'd rather have a bzip2'ed tarball, then gzipped, and finally plain tar. + for ext in .tar.bz2 .tar.gz .tgz .tar; do + # Try all urls in turn + for url in "$@"; do + case "${url}" in +# svn://*) CT_DoGetFileSVN "${file}" ${url}";; +# cvs://*) CT_DoGetFileCVS "${file}" ${url}";; + *) CT_DoLog EXTRA "Trying \"${url}/${file}${ext}\"" + ${CT_DoGetFile} "${url}/${file}${ext}" 2>&1 |CT_DoLog DEBUG + ;; + esac + [ -f "${file}${ext}" ] && got_it=1 && break 2 || true + done + done + fi + CT_Popd + + CT_TestAndAbort "Could not download \"${file}\", and not present in \"${CT_TARBALLS_DIR}\"" ${got_it} -eq 0 +} + +#----------------------------------------------------------------------------- + +# Extract a tarball and patch. +# Some tarballs need to be extracted in specific places. Eg.: glibc addons +# must be extracted in the glibc directory; uCLibc locales must be extracted +# in the extra/locale sub-directory of uClibc. +CT_ExtractAndPatch() { + local file="$1" + local base_file=`echo "${file}" |cut -d - -f 1` + local ver_file=`echo "${file}" |cut -d - -f 2-` + local official_patch_dir + local custom_patch_dir + local libc_addon + local ext=`CT_GetFileExtension "${file}"` + CT_TestAndAbort "\"${file}\" not found in \"${CT_TARBALLS_DIR}\"" -z "${ext}" + local full_file="${CT_TARBALLS_DIR}/${file}${ext}" + + CT_Pushd "${CT_SRC_DIR}" + + # Add-ons need a little love, really. + case "${file}" in + glibc-[a-z]*-*) + CT_TestAndAbort "Trying to extract the C-library addon/locales \"${file}\" when C-library not yet extracted" ! -d "${CT_LIBC_FILE}" + cd "${CT_LIBC_FILE}" + libc_addon=y + [ -f ".${file}.extracted" ] && return 0 + touch ".${file}.extracted" + ;; + uClibc-locale-*) + CT_TestAndAbort "Trying to extract the C-library addon/locales \"${file}\" when C-library not yet extracted" ! -d "${CT_LIBC_FILE}" + cd "${CT_LIBC_FILE}/extra/locale" + libc_addon=y + [ -f ".${file}.extracted" ] && return 0 + touch ".${file}.extracted" + ;; + esac + + # If the directory exists, then consider extraction and patching done + [ -d "${file}" ] && return 0 + + CT_DoLog EXTRA "Extracting \"${file}\"" + case "${ext}" in + .tar.bz2) tar xvjf "${full_file}" |CT_DoLog DEBUG;; + .tar.gz|.tgz) tar xvzf "${full_file}" |CT_DoLog DEBUG;; + .tar) tar xvf "${full_file}" |CT_DoLog DEBUG;; + *) CT_Abort "Don't know how to handle \"${file}\": unknown extension" ;; + esac + + # Snapshots might not have the version number in the extracted directory + # name. This is also the case for some (old) packages, such as libfloat. + # Overcome this issue by symlink'ing the directory. + if [ ! -d "${file}" -a "${libc_addon}" != "y" ]; then + case "${ext}" in + .tar.bz2) base=`tar tjf "${full_file}" |head -n 1 |cut -d / -f 1 || true`;; + .tar.gz|.tgz) base=`tar tzf "${full_file}" |head -n 1 |cut -d / -f 1 || true`;; + .tar) base=`tar tf "${full_file}" |head -n 1 |cut -d / -f 1 || true`;; + esac + CT_TestOrAbort "There was a problem when extracting \"${file}\"" -d "${base}" -o "${base}" != "${file}" + ln -s "${base}" "${file}" + fi + + # Kludge: outside this function, we wouldn't know if we had just extracted + # a libc addon, or a plain package. Apply patches now. + CT_DoLog EXTRA "Patching \"${file}\"" + + # If libc addon, we're already in the correct place. + [ -z "${libc_addon}" ] && cd "${file}" + + [ "${CUSTOM_PATCH_ONLY}" = "y" ] || official_patch_dir="${CT_TOP_DIR}/patches/${base_file}/${ver_file}" + [ "${CT_CUSTOM_PATCH}" = "y" ] && custom_patch_dir="${CT_CUSTOM_PATCH_DIR}/${base_file}/${ver_file}" + for patch_dir in "${official_patch_dir}" "${custom_patch_dir}"; do + if [ -n "${patch_dir}" -a -d "${patch_dir}" ]; then + for p in "${patch_dir}"/*.patch; do + if [ -f "${p}" ]; then + CT_DoLog DEBUG "Applying patch \"${p}\"" + patch -g0 -F1 -p1 -f <"${p}" |CT_DoLog DEBUG + CT_TestAndAbort "Failed while applying patch file \"${p}\"" ${PIPESTATUS[0]} -ne 0 + fi + done + fi + done + + CT_Popd +} + +#----------------------------------------------------------------------------- + +# Get the file name extension of a component +# Usage: CT_GetFileExtension +# If found, echoes the extension to stdout +# If not found, echoes nothing on stdout. +CT_GetFileExtension() { + local ext + local file="$1" + local got_it=1 + + CT_Pushd "${CT_TARBALLS_DIR}" + for ext in .tar.gz .tar.bz2 .tgz .tar; do + if [ -f "${file}${ext}" ]; then + echo "${ext}" + got_it=0 + break + fi + done + CT_Popd + + return 0 +} + +#----------------------------------------------------------------------------- + +# Create needed directories, remove old ones +mkdir -p "${CT_TARBALLS_DIR}" +if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then + mv "${CT_SRC_DIR}" "${CT_SRC_DIR}.$$" + nohup rm -rf "${CT_SRC_DIR}.$$" >/dev/null 2>&1 & +fi +mkdir -p "${CT_SRC_DIR}" + +# Make all path absolute, it so much easier! +# Now we have had the directories created, we even will get rid of embedded .. in paths: +CT_SRC_DIR="`CT_MakeAbsolutePath \"${CT_SRC_DIR}\"`" +CT_TARBALLS_DIR="`CT_MakeAbsolutePath \"${CT_TARBALLS_DIR}\"`" + +# Prepare the addons list to be parsable: +addons_list="`echo \"${CT_LIBC_ADDONS_LIST}\" |sed -r -e 's/,/ /g; s/ $//g;'`" + +if [ "${CT_NO_DOWNLOAD}" != "y" ]; then + CT_DoStep INFO "Retrieving needed toolchain components' tarballs" + + # Kernel: for now, I don't care about cygwin. + CT_GetFile "${CT_KERNEL_FILE}" \ + ftp://ftp.kernel.org/pub/linux/kernel/v2.6 \ + ftp://ftp.kernel.org/pub/linux/kernel/v2.4 \ + ftp://ftp.kernel.org/pub/linux/kernel/v2.2 \ + ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing \ + http://ep09.pld-linux.org/~mmazur/linux-libc-headers + + # binutils + CT_GetFile "${CT_BINUTILS_FILE}" \ + ftp://ftp.gnu.org/gnu/binutils \ + ftp://ftp.kernel.org/pub/linux/devel/binutils + + # Core and final gcc + # Ah! gcc folks are kind of 'different': they store the tarballs in + # subdirectories of the same name! That's because gcc is such /crap/ that + # it is such /big/ that it needs being splitted for distribution! Sad. :-( + # Arrgghh! Some of those versions does not follow this convention: + # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a + # subdirectory! You bastard! + CT_GetFile "${CT_CC_CORE_FILE}" \ + ftp://ftp.gnu.org/gnu/gcc/${CT_CC_CORE_FILE} \ + ftp://ftp.gnu.org/gnu/gcc/releases/${CT_CC_CORE_FILE} \ + ftp://ftp.gnu.org/gnu/gcc + CT_GetFile "${CT_CC_FILE}" \ + ftp://ftp.gnu.org/gnu/gcc/${CT_CC_FILE} \ + ftp://ftp.gnu.org/gnu/gcc/releases/${CT_CC_FILE} \ + ftp://ftp.gnu.org/gnu/gcc + + # C library + case "${CT_LIBC}" in + glibc) + # Ah! Not all GNU folks seem stupid. All glibc releases are in the same + # directory. Good. Alas, there is no snapshot there. I'll deal with them + # later on... :-/ + libc_src="ftp://ftp.gnu.org/gnu/glibc" + ;; + uClibc) + # For uClibc, we have almost every thing: releases, and snapshots + # for the last month or so. We'll have to deal with svn revisions + # later... + libc_src="http://www.uclibc.org/downloads + http://www.uclibc.org/downloads/snapshots + http://www.uclibc.org/downloads/old-releases" + ;; + esac + CT_GetFile "${CT_LIBC_FILE}" ${libc_src} + + # C library addons + addons_list=`echo "${CT_LIBC_ADDONS}" |sed -r -e 's/,/ /g; s/ $//g;'` + for addon in ${addons_list}; do + CT_GetFile "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" \ + ftp://ftp.gnu.org/gnu/glibc + done + if [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ]; then + CT_GetFile "uClibc-locale-030818" \ + http://www.uclibc.org/downloads \ + http://www.uclibc.org/downloads/snapshots \ + http://www.uclibc.org/downloads/old-releases + fi + + # libfloat if asked for + if [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ]; then + lib_float_url="ftp://ftp.de.debian.org/debian/pool/main/libf/libfloat/" + + # Please note: because the file we download, and the file we store on the + # file system don't have the same name, CT_GetFile will always try to + # download the file over and over. + # To avoid this, we check that the file we want already exists in the + # tarball directory first. This is an ugly hack that overrides the standard + # CT_GetFile behavior... Sight... + ext=`CT_GetFileExtension "${CT_LIBFLOAT_FILE}"` + if [ -z "${ext}" ]; then + CT_GetFile libfloat_990616.orig "${lib_float_url}" + ext=`CT_GetFileExtension "libfloat_990616.orig"` + # Hack: remove the .orig extension, and change _ to - + mv -v "${CT_TARBALLS_DIR}/libfloat_990616.orig${ext}" \ + "${CT_TARBALLS_DIR}/libfloat-990616${ext}" 2>&1 |CT_DoLog DEBUG + fi + fi + + CT_EndStep +fi # CT_NO_DOWNLOAD + +if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then + CT_DoStep INFO "Extracting and patching toolchain components" + + CT_ExtractAndPatch "${CT_KERNEL_FILE}" + CT_ExtractAndPatch "${CT_BINUTILS_FILE}" + CT_ExtractAndPatch "${CT_CC_CORE_FILE}" + CT_ExtractAndPatch "${CT_CC_FILE}" + CT_ExtractAndPatch "${CT_LIBC_FILE}" + for addon in ${addons_list}; do + CT_ExtractAndPatch "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" + done + if [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ]; then + CT_ExtractAndPatch "uclibc-locale-030818" + fi + + [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] && CT_ExtractAndPatch "${CT_LIBFLOAT_FILE}" + + CT_EndStep +fi diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 0000000..c62796e --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,11 @@ +CONFIG_SUB_SRC="http://cvs.savannah.gnu.org/viewcvs/*checkout*/config/config/config.sub" +CONFIG_SUB_DEST="$(CT_TOP_DIR)/tools/config.sub" +CONFIG_GUESS_SRC="http://cvs.savannah.gnu.org/viewcvs/*checkout*/config/config/config.guess" +CONFIG_GUESS_DEST="$(CT_TOP_DIR)/tools/config.guess" + +updatetools: + @wget "$(CONFIG_SUB_SRC)" -O "$(CONFIG_SUB_DEST)" + @wget "$(CONFIG_GUESS_SRC)" -O "$(CONFIG_GUESS_DEST)" + +help:: + @echo ' updatetools - Update the config tools' diff --git a/tools/addToolVersion.sh b/tools/addToolVersion.sh new file mode 100755 index 0000000..5a53ea7 --- /dev/null +++ b/tools/addToolVersion.sh @@ -0,0 +1,99 @@ +#!/bin/sh + +# Adds a new version to one of the toolchain component +myname="$0" + +doHelp() { + cat <<-EOF +Usage: ${myname} [option] + 'tool' in one of: + --gcc, --tcc, --binutils, --glibc, --uClibc, --linux, --cygwin + + Valid mandatory 'option' for tool==gcc is one of: + --core, --final + + Valid mandatory 'option' for tool==linux is one of: + --install, --sanitised, --copy + + 'version' is a valid version for the specified tool. + + Examples: + add version 2.6.19.2 to linux kernel install method: + ${myname} --linux --install 2.6.19.2 + + add versions 2.3.5 and 2.3.6 to glibc: + ${myname} --glibc 2.3.5 2.3.6 +EOF +} + +tool= +tool_prefix= +CORE= +FINAL= +VERSION= + +i=1 +while [ $i -le $# ]; do + case "${!i}" in + --gcc) cat=CC; tool=gcc; tool_prefix=cc_; tool_suffix=;; +# --tcc) cat=CC; tool=tcc; tool_prefix=cc_; tool_suffix=;; + --binutils) cat=BINUTILS; tool=binutils; tool_prefix=; tool_suffix=;; + --glibc) cat=LIBC; tool=glibc; tool_prefix=libc_; tool_suffix=;; + --uClibc) cat=LIBC; tool=uClibc; tool_prefix=libc_; tool_suffix=;; + --linux) cat=KERNEL; tool=linux; tool_prefix=kernel_;; +# --cygwin) cat=KERNEL; tool=cygwin; tool_prefix=kernel_;; + --core) CORE=1;; + --final) FINAL=1;; + --install) tool_suffix=install;; + --sanitised) tool_suffix=sanitised;; + --copy) tool_suffix=copy;; + -h|--help) doHelp; exit 0;; + -*) echo "Unknown option: \"${!i}\". (use -h/--help for help"; exit 1;; + *) VERSION="${VERSION} ${!i}";; + esac + i=$((i+1)) +done + +[ -n "${tool}" -o -n "${VERSION}" ] || { doHelp; exit 1; } + +case "${cat}" in + CC) ;; + KERNEL) FINAL=; CORE=;; + *) FINAL=1; CORE=;; +esac + +for ver in ${VERSION}; do + v=`echo "${ver}" |sed -r -e 's/-/_/g; s/\./_/g;'` + if [ -n "${CORE}" ]; then + L1="config ${cat}_CORE_V_${v}\n" + L2=" bool\n" + L3=" prompt \"${ver}\"\n" + L4=" default \"${ver}\" if ${cat}_CORE_V_${v}" + sed -r -i -e 's/^(# CT_INSERT_VERSION_ABOVE)$/'"${L1}${L2}${L3}"'\n\1/; + s/^(# CT_INSERT_VERSION_STRING_ABOVE)$/'"${L4}"'\n\1/;' config/${tool_prefix}core_${tool}.in + fi + if [ -n "${FINAL}" ]; then + L1="config ${cat}_V_${v}\n" + L2=" bool\n" + L3=" prompt \"${ver}\"\n" + L4=" default \"${ver}\" if ${cat}_V_${v}" + sed -r -i -e 's/^(# CT_INSERT_VERSION_ABOVE)$/'"${L1}${L2}${L3}"'\n\1/; + s/^(# CT_INSERT_VERSION_STRING_ABOVE)$/'"${L4}"'\n\1/;' config/${tool_prefix}${tool}.in + fi + if [ "${cat}" = "KERNEL" ]; then + TOOL_SUFFIX="`echo \"${tool_suffix}\" |tr [[:lower:]] [[:upper:]]`" + L1="config ${cat}_${TOOL_SUFFIX}_V_${v}\n" + L2=" bool\n" + L3=" prompt \"${ver}\"\n" + # Extra versions are not necessary visible: + case "${ver}" in + *.*.*.*) L4=" depends on KERNEL_VERSION_SEE_EXTRAVERSION\n";; + *) L4=;; + esac + # Sanitised headers always have an extra version: + [ "${tool_suffix}" = "sanitised" ] && L4= + L5=" default \"${ver}\" if ${cat}_${TOOL_SUFFIX}_V_${v}" + sed -r -i -e 's/^(# CT_INSERT_VERSION_ABOVE)$/'"${L1}${L2}${L3}${L4}"'\n\1/; + s/^(# CT_INSERT_VERSION_STRING_ABOVE)$/'"${L5}"'\n\1/;' config/${tool_prefix}${tool}_headers_${tool_suffix}.in + fi +done diff --git a/tools/config.guess b/tools/config.guess new file mode 100755 index 0000000..6cc26cd --- /dev/null +++ b/tools/config.guess @@ -0,0 +1,1513 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-01-15' + +# 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 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +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 ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +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 ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[3456]*) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T:Interix*:[3456]* | authenticamd:Interix*:[3456]*) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa:Linux:*:*) + echo xtensa-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# 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/tools/config.sub b/tools/config.sub new file mode 100755 index 0000000..5defff6 --- /dev/null +++ b/tools/config.sub @@ -0,0 +1,1622 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-01-18' + +# 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. +# +# 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 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# 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 . 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. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +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 ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +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 ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # 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 ;; + + * ) + 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 + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -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. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | 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 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # 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*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 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-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | 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) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + 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 + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + 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]) + basic_machine=hppa1.1-hp + ;; + 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) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *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/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + 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 + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + 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 + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + 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 + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + 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 + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-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 + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# 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) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + 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 + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -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* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -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* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -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* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -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|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -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 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: -- cgit v0.10.2-6-g49f6