summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog210
-rw-r--r--FAQ32
-rw-r--r--Makeconfig4
-rw-r--r--Makefile7
-rw-r--r--Makerules5
-rw-r--r--config.make.in2
-rwxr-xr-xconfigure93
-rw-r--r--configure.in15
-rw-r--r--elf/Makefile8
-rw-r--r--glibcbug.in16
-rw-r--r--inet/arpa/inet.h1
-rw-r--r--inet/netinet/ip.h3
-rw-r--r--libc-symbols.h31
-rw-r--r--locale/C-time.c30
-rw-r--r--locale/localeinfo.h34
-rw-r--r--locale/programs/ld-time.c6
-rw-r--r--locale/programs/linereader.c32
-rw-r--r--malloc/malloc.c4
-rw-r--r--misc/syslog.c4
-rw-r--r--posix/getopt.c13
-rw-r--r--resolv/nss_dns/dns-host.c13
-rw-r--r--stdio-common/Makefile5
-rw-r--r--stdio-common/bug10.c4
-rw-r--r--stdio-common/scanf1.c8
-rw-r--r--stdio-common/scanf10.c2
-rw-r--r--stdio-common/scanf11.c14
-rw-r--r--stdio-common/scanf3.c4
-rw-r--r--stdio-common/tstdiomisc.c2
-rw-r--r--stdio-common/vfscanf.c23
-rw-r--r--stdlib/strtol.c9
-rw-r--r--stdlib/tst-strtol.c8
-rw-r--r--sysdeps/generic/sysd-stdio.c30
-rw-r--r--sysdeps/libm-i387/e_exp.S2
-rw-r--r--sysdeps/libm-i387/e_expf.S2
-rw-r--r--sysdeps/libm-i387/e_expl.S2
-rw-r--r--sysdeps/libm-i387/s_expm1.S12
-rw-r--r--sysdeps/libm-i387/s_expm1f.S12
-rw-r--r--sysdeps/libm-i387/s_expm1l.S12
-rw-r--r--sysdeps/mach/hurd/posix_opt.h9
-rw-r--r--sysdeps/mach/hurd/vdprintf.c57
-rw-r--r--sysdeps/mach/libc-lock.h36
-rw-r--r--sysdeps/posix/vdprintf.c49
-rw-r--r--sysdeps/stub/vdprintf.c31
-rw-r--r--sysdeps/unix/Makefile2
-rw-r--r--sysdeps/unix/bsd/bsd4.4/direntry.h28
-rw-r--r--sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h7
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h85
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sys/procfs.h109
-rw-r--r--sysdeps/unix/sysv/linux/i386/getgroups.c43
-rw-r--r--sysdeps/unix/sysv/linux/i386/setgroups.c41
-rw-r--r--sysdeps/unix/sysv/linux/i386/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/kernel_sigaction.h10
-rw-r--r--sysdeps/unix/sysv/linux/m68k/getgroups.c2
-rw-r--r--sysdeps/unix/sysv/linux/m68k/setgroups.c2
-rw-r--r--sysdeps/unix/sysv/linux/m68k/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/sigaction.c63
-rw-r--r--sysdeps/unix/sysv/linux/sys/ipc_buf.h44
-rw-r--r--sysdeps/unix/sysv/linux/sys/mtio.h242
-rw-r--r--sysdeps/unix/sysv/linux/sys/procfs.h82
-rw-r--r--sysdeps/unix/sysv/linux/sys/sysmacros.h6
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list1
-rw-r--r--time/Makefile43
-rw-r--r--time/mktime.c37
-rw-r--r--time/simplebackw2
-rw-r--r--time/strptime.c471
-rw-r--r--time/test-tz.c5
-rw-r--r--time/tzfile.c42
-rw-r--r--time/tzselect.ksh8
-rw-r--r--time/tzset.c15
-rw-r--r--values.h11
70 files changed, 1891 insertions, 410 deletions
diff --git a/ChangeLog b/ChangeLog
index 6389d5a268..7781e5c371 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -22,6 +22,216 @@ Tue Jan 7 09:48:15 1997 Andreas Jaeger <aj@arthur.pfalz.de>
* signal/sigempty.c (sigemptyset): Correct typo: Empty set should
have all bits zero.
+Sun Jan 19 04:38:20 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * config.make.in (have-ksh, KSH): New variables. Will be filled
+ in by configure.
+ * configure.in: Add test for ksh like shell (prefer bash).
+ * time/Makefile (tests): Depend on install-test-data.
+ (distribute): Add simplebackw.
+ (generated-dirs): New variable.
+ [$(have-ksh)==yes] (install-others): Add iso3166.tab and zone.tab.
+ (install-bin): Add tzselect.
+ (install-test-data): Install the zoneinfo files which are needed
+ for the test case in the build directory.
+ (test-tz-ENV): New variable. Call test-tz program using data in
+ build directory.
+ * time/simpleback: New file.
+ * time/test-tz.c: Pretty print.
+ * time/tzfile.c: Use value of environment variable TZDIR as directory
+ to look for zone info files.
+ don't let search for DST data destroy already found values.
+ * time/tzselect.ksh: Use @KSH@ and @TZDIR@ to be substituted when
+ installing.
+ * time/tzset.c (__tzset_internal): Avoid freeing string twice.
+ Set DST zone name to normal zone name if no information is provided.
+
+ * time/mktime.c (mktime): Call __tzset_internal to use current
+ value of TZ.
+
+ * Makerules (common-clean): Remove $(generated-dirs) inclusing content.
+
+ * glibcbug.in: Fix several bugs. Reported by several people.
+
+ * elf/Makefile: Correct dependecies for $(objpfx)ldd.
+
+ * inet/netinet/ip.h: Define IPTOS_LOWCOST and IPTOS_MINCOST.
+
+ * locale/C-time.c: Update copyright.
+ * locale/localeinfo.h: Likewise.
+ * sysdeps/unix/bsd/bsd4.4/direntry.h: Likewise.
+
+ * locale/programs/ld-time.c (time_finish): Correct message string.
+ * locale/programs/linereader.c (lr_token): Use correctly `number'
+ not `digit' in message string.
+
+ * stdlib/strtol.c [UNSIGNED]: Don't punt immediately when `-' is
+ seen. Instead return ULONG_MAX and set ERANGE.
+ * stdlib/tst-strtol.c: Correct test to reflect above change.
+
+Sun Jan 19 03:22:30 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/sysv/linux/sys/mtio.h: Don't use <linux/mtio.h>.
+ We must not use <linux/posix_types.h>.
+
+ * sysdeps/unix/sysv/linux/sys/ipc_buf.h: Don't use __kernel_* types
+ since we must not use <linux/posix_types.h>.
+ * sysdeps/unix/sysv/linux/sys/procfs.h: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h: New file. Similar
+ to sysdeps/unix/sysv/linux/sys/ipc_buf.h, but use alpha relavent
+ types.
+ * sysdeps/unix/sysv/linux/alpha/sys/procfs.h: New file. Similar
+ to sysdeps/unix/sysv/linux/sys/procfs.h, but use alpha relavent
+ types.
+
+Sun Jan 19 01:48:20 1997 H.J. Lu <hjl@gnu.ai.mit.edu>
+
+ * sysdeps/libm-i387/e_exp.S: Correct computation of fractional
+ part.
+ * sysdeps/libm-i387/e_expf.S: Likewise.
+ * sysdeps/libm-i387/e_expl.S: Likewise.
+ * sysdeps/libm-i387/s_expm1.S: Correct computation of fractional
+ part. Take care of additional value left on stack by fscale.
+ * sysdeps/libm-i387/s_expm1f.S: Likewise.
+ * sysdeps/libm-i387/s_expm1l.S: Likewise.
+
+Fri Jan 17 17:45:32 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * posix/getopt.c: Change all direct usages of `gettext' to `_'.
+
+ * sysdeps/generic/sysd-stdio.c (__stdio_reopen): Add missing
+ parameter.
+ Reported by Harmanjit Singh <harman@netearth.iitd.ernet.in>.
+
+Thu Jan 16 23:39:25 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * stdio-common/Makefile (tests): Add scanf11.
+ * stdio-common/scanf11.c: New file.
+ * stdio-common/vfscanf.c (__vfscanf): Increment `done' when %n
+ was processed and value is not suppressed.
+ * stdio-common/bug10.c: Correct test to expect %n increment the
+ return value of scanf.
+ * stdio-common/scanf1.c: Likewise.
+ * stdio-common/scanf3.c: Likewise.
+ * stdio-common/scanf10.c: Likewise.
+ * stdio-common/tstdiomisc.c: Likewise.
+
+ * time/strptime.c: Add lots of conditional compiling to enable use
+ outside glibc. When used in glibc, make sure C locale format
+ strings will always be recognized.
+
+Sat Jan 11 18:53:47 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/sys/sysmacros.h (major, minor, makedev):
+ Fix definitions so that they work with __kernel_dev_t.
+
+Sat Jan 11 14:24:10 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/kernel_sigaction.h,
+ sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h,
+ sysdeps/unix/sysv/linux/sigaction.c: New files.
+ * sysdeps/unix/sysv/linux/syscalls.list: Add s_sigaction.
+
+Sun Jan 12 15:22:33 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * libc-symbols.h (link_warning): Make sure that the .gnu.warning
+ section is not allocated.
+ Update and reformat copyright.
+
+Sun Jan 12 12:19:28 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * elf/Makefile ($(objpfx)ldd): Fix depedency list.
+
+Sat Jan 11 15:11:26 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls): Fix
+ command so that it works in subdirectories.
+
+Wed Jan 8 22:07:58 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/i386/syscalls.list: Add s_getgroups and
+ s_setgroups.
+ * sysdeps/unix/sysv/linux/m68k/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/i386/getgroups.c,
+ sysdeps/unix/sysv/linux/i386/setgroups.c,
+ sysdeps/unix/sysv/linux/m68k/getgroups.c,
+ sysdeps/unix/sysv/linux/m68k/setgroups.c: New files.
+
+Wed Jan 8 19:42:59 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makefile (config.status): Delete bogus rule.
+ ($(objpfx)glibcbug): Renamed from plain `glibcbug', depend on
+ config.status in build directory, fix command to change to build
+ directory.
+ * Makeconfig ($(common-objpfx)config.status): Depend on version.h.
+
+Thu Jan 9 08:47:54 1997 Andreas Jaeger <aj@arthur.pfalz.de>
+
+ * glibcbug.in (while): We test for four and not five conditions,
+ set MAIL_AGENT instead of RMAIL, filter spaces and tabs.
+
+Thu Jan 16 22:00:27 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * misc/syslog.c: Don't define cancel_handler if _LIBC_REENTRANT
+ is not defined. Reported by Andreas Jaeger.
+
+Thu Jan 9 08:47:54 1997 Andreas Jaeger <aj@arthur.pfalz.de>
+
+ * new-malloc/malloc.c (__MALLOC_P): define call to pthread
+ initializer only if NO_THREADS is not defined.
+
+Wed Jan 8 21:28:58 1997 Andreas Jaeger <aj@arthur.pfalz.de>
+
+ * resolv/nss_dns/dns-host.c: Clean-up: delete unnecessary includes
+ and variables.
+
+Thu Jan 16 21:50:27 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * inet/arpa/inet.h: Include <netinet/in.h> to get struct in_addr
+ defined.
+
+Tue Jan 7 17:29:59 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makerules (LDLIBS-c.so): New variable.
+
+Tue Jan 7 19:22:00 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makefile ($(includedir)/gnu/lib-names.h): Define the library
+ names as strings, not as sequence of tokens that may fall apart.
+
+Fri Jan 10 14:08:41 1997 Roland McGrath <roland@fmh.frob.com>
+
+ * time/tzfile.c (__tzfile_read): Check for bogus type and zone name
+ indices in data file and punt, so a bogus file can't crash us.
+
+Thu Jan 16 20:29:15 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * values.h [__USE_MISC]: Define BITSPERBYTE.
+
+Fri Jan 17 14:16:28 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+
+ * stdio/vdprintf.c: Moved file to ...
+ * sysdeps/posix/vdprintf.c: Here. De-ansideclificate.
+ * sysdeps/stub/vdprintf.c: New file.
+ * sysdeps/mach/hurd/vdprintf.c: New file.
+
+Thu Jan 9 15:59:35 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+
+ * sysdeps/mach/hurd/posix_opt.h: New file.
+
+ * sysdeps/mach/hurd/sigwait.c (sigwait): Don't affect signal mask.
+
+ * sysdeps/unix/bsd/tcsendbrk.c (tcsendbreak): Finish
+ deansideclification.
+
+ * sysdeps/mach/libc-lock.h: Add kludges to pretend to implement
+ recursive locks.
+
+Tue Jan 7 09:48:15 1997 Andreas Jaeger <aj@arthur.pfalz.de>
+
+ * signal/sigempty.c (sigemptyset): Correct typo: Empty set should
+ have all bits zero.
+
Tue Jan 7 23:44:39 1997 Ulrich Drepper <drepper@cygnus.com>
* inet/gethstbynm.c: Include additional headers for additional
diff --git a/FAQ b/FAQ
index e5b18bfdfa..642dfee9a6 100644
--- a/FAQ
+++ b/FAQ
@@ -260,7 +260,7 @@ incompatibilities:
* swapon(): the interface of this function didn't changed, but the
prototype is in a separate header file <sys/swap.h>. For the additional
- argument of of swapon() you should use the SWAP_* constants from
+ argument of swapon() you should use the SWAP_* constants from
<linux/swap.h>, which get defined when <sys/swap.h> is included.
* errno: If a program uses variable "errno", then it _must_ include header
@@ -298,6 +298,13 @@ incompatibilities:
a separate library libresolv. If you find some symbols starting with
`res_*' undefined simply add -lresolv to your call of the linker.
+* the `signal' function's behaviour corresponds to the BSD semantic and
+ not the SysV semantic as it was in libc-5. The interface on all GNU
+ systems shall be the same and BSD is the semantic of choice. To use
+ the SysV behaviour simply use `sysv_signal'. The major difference is
+ that the SysV implementation sets the SA_ONESHOT flag and so the handler
+ gets removed after the first call.
+
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
[Q10] ``Why does getlogin() always return NULL on my Linux box?''
@@ -365,10 +372,10 @@ catalog files to the XPG4 form:
[Q13] ``How do I configure GNU libc so that the essential libraries
like libc.so go into /lib and the other into /usr/lib?''
-[A13] {UD} Like all other GNU packages GNU libc is configured to use a
-base directory and install all files relative to this. If you intend
-to really use GNU libc on your system this base directory is /usr. I.e.,
-you run
+[A13] {UD,AJ} Like all other GNU packages GNU libc is configured to
+use a base directory and install all files relative to this. If you
+intend to really use GNU libc on your system this base directory is
+/usr. I.e., you run
configure --prefix=/usr <other_options>
Some systems like Linux have a filesystem standard which makes a
@@ -378,10 +385,10 @@ located on the same disk partition as /. The /usr subtree might be
found on another partition/disk.
To install the essential libraries which come with GNU libc in /lib
-one must explicitly tell this. Autoconf has no option for this so you
-have to use the file where all user supplied additional information
-should go in: `configparms' (see the `INSTALL' file). For Linux the
-`configparms' file should contain:
+one must explicitly tell this (except on Linux, see below). Autoconf
+has no option for this so you have to use the file where all user
+supplied additional information should go in: `configparms' (see the
+`INSTALL' file). Therefore the `configparms' file should contain:
slibdir=/lib
sysconfdir=/etc
@@ -390,6 +397,10 @@ The first line specifies the directory for the essential libraries,
the second line the directory for file which are by tradition placed
in a directory named /etc.
+No rule without an exception: If you configure for Linux with
+--prefix=/usr, then slibdir and sysconfdir will automatically be
+defined as stated above.
+
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
[Q14] ``When linking with the new libc I get unresolved symbols
@@ -534,7 +545,7 @@ a different name: ld-linux.so.2. So you have to replace
by
%{!dynamic-linker:-dynamic-linker=/home/gnu/lib/ld.so.1}
-in the above example specs file ti make it work for other systems.
+in the above example specs file to make it work for other systems.
Future versions of GCC will automatically provide the correct specs.
@@ -606,6 +617,7 @@ Answers were given by:
{DMT} David Mosberger-Tang, <davidm@AZStarNet.com>
{RM} Roland McGrath, <roland@gnu.ai.mit.edu>
{HJL} H.J. Lu, <hjl@gnu.ai.mit.edu>
+{AJ} Andreas Jaeger, <aj@arthur.pfalz.de>
Local Variables:
mode:text
diff --git a/Makeconfig b/Makeconfig
index 4f65e6d476..e3f7b5290e 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -96,7 +96,7 @@ $(common-objpfx)config.make: $(common-objpfx)config.status $(..)config.h.in
# Find all the sysdeps configure fragments, to make sure we re-run
# configure when any of them changes.
-$(common-objpfx)config.status: $(..)configure \
+$(common-objpfx)config.status: $(..)version.h $(..)configure \
$(foreach dir,$(full-config-sysdirs),\
$(wildcard \
$(dir)/Implies) \
diff --git a/Makefile b/Makefile
index 00be7a8d89..6420be8b30 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,6 @@ endef
configure: configure.in aclocal.m4; $(autoconf-it)
%/configure: %/configure.in aclocal.m4; $(autoconf-it)
-config.status: configure version.h; $(SHELL) ./config.status --recheck
include Makeconfig
@@ -198,7 +197,7 @@ $(includedir)/gnu/lib-names.h: $(common-objpfx)soversions.mk
for l in $$libs; do \
upname=`echo $$l | sed 's/[.]so.*//' | \
tr '[:lower:]-' '[:upper:]_'`; \
- echo "#define $${upname}_SO $$l"; \
+ echo "#define $${upname}_SO \"$$l\""; \
done;) | sort; \
echo; \
echo '#endif /* gnu/lib-names.h */';) > $(objpfx)lib-names.h
@@ -210,8 +209,8 @@ endif
# The `glibcbug' script contains the version number and it shall be rebuild
# whenever this changes or the `glibcbug.in' file.
-glibcbug: glibcbug.in config.status
- CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+$(objpfx)glibcbug: $(common-objpfx)config.status glibcbug.in
+ cd $(<D); CONFIG_FILES=$(@F) CONFIG_HEADERS= $(SHELL) $(<F)
# This makes the Info or DVI file of the documentation from the Texinfo source.
.PHONY: info dvi
diff --git a/Makerules b/Makerules
index abff545546..88d55a664a 100644
--- a/Makerules
+++ b/Makerules
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -344,6 +344,8 @@ endef
# Also omits crti.o and crtn.o, which we do not want
# since we define our own `.init' section specially.
LDFLAGS-c.so = -nostdlib -nostartfiles
+# But we still want to link libc.so against -lgcc.
+LDLIBS-c.so = -lgcc
# Give libc.so an entry point and make it directly runnable itself.
LDFLAGS-c.so += -e __libc_main
# Use our own special initializer and finalizer files for libc.so.
@@ -823,6 +825,7 @@ endef
# Also remove the dependencies and generated source files.
common-clean: common-mostlyclean
-rm -f $(addprefix $(objpfx),$(generated)) $(+depfiles)
+ -rm -fr $(addprefix $(objpfx),$(generated-dirs))
-rm -f $(addprefix $(common-objpfx),$(common-generated))
-rm -f $(common-objpfx)distinfo-$(subdir)
diff --git a/config.make.in b/config.make.in
index 8211b64b05..a4a667625e 100644
--- a/config.make.in
+++ b/config.make.in
@@ -23,6 +23,7 @@ have-initfini = @libc_cv_have_initfini@
have-no-whole-archive = @libc_cv_ld_no_whole_archive@
have-no-exceptions = @libc_cv_gcc_no_exceptions@
have-bash2 = @libc_cv_have_bash2@
+have-ksh = @libc_cv_have_ksh@
# Configuration options.
gnu-as = @gnu_as@
@@ -49,5 +50,6 @@ INSTALL_DATA = @INSTALL_DATA@
LN_S = @LN_S@
MSGFMT = @MSGFMT@
BASH = @BASH@
+KSH = @KSH@
# More variables may be inserted below by configure.
diff --git a/configure b/configure
index cf93d8addb..b1772ec0ed 100755
--- a/configure
+++ b/configure
@@ -1409,8 +1409,53 @@ else
fi
+if test "$BASH" = no; then
+ # Extract the first word of "ksh", so it can be a program name with args.
+set dummy ksh; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1417: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$KSH" in
+ /*)
+ ac_cv_path_KSH="$KSH" # Let the user override the test with a path.
+ ;;
+ *)
+ 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_path_KSH="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_KSH" && ac_cv_path_KSH="no"
+ ;;
+esac
+fi
+KSH="$ac_cv_path_KSH"
+if test -n "$KSH"; then
+ echo "$ac_t""$KSH" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test "$KSH" = no; then
+ libc_cv_have_ksh=no
+ else
+ libc_cv_have_ksh=yes
+ fi
+else
+ KSH="$BASH"
+
+ libc_cv_have_ksh=yes
+fi
+
+
echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6
-echo "configure:1414: checking for signed size_t type" >&5
+echo "configure:1459: checking for signed size_t type" >&5
if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1434,12 +1479,12 @@ EOF
fi
echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6
-echo "configure:1438: checking for libc-friendly stddef.h" >&5
+echo "configure:1483: checking for libc-friendly stddef.h" >&5
if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1443 "configure"
+#line 1488 "configure"
#include "confdefs.h"
#define __need_size_t
#define __need_wchar_t
@@ -1454,7 +1499,7 @@ size_t size; wchar_t wchar;
if (&size == NULL || &wchar == NULL) abort ();
; return 0; }
EOF
-if { (eval echo configure:1458: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1503: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_friendly_stddef=yes
else
@@ -1473,7 +1518,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly."
fi
echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6
-echo "configure:1477: checking whether we need to use -P to assemble .S files" >&5
+echo "configure:1522: checking whether we need to use -P to assemble .S files" >&5
if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1496,7 +1541,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives."
fi
echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6
-echo "configure:1500: checking for assembler global-symbol directive" >&5
+echo "configure:1545: checking for assembler global-symbol directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1526,7 +1571,7 @@ EOF
fi
echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6
-echo "configure:1530: checking for .set assembler directive" >&5
+echo "configure:1575: checking for .set assembler directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1561,12 +1606,12 @@ fi
if test $elf != yes; then
echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
-echo "configure:1565: checking for .init and .fini sections" >&5
+echo "configure:1610: checking for .init and .fini sections" >&5
if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1570 "configure"
+#line 1615 "configure"
#include "confdefs.h"
int main() {
@@ -1575,7 +1620,7 @@ asm (".section .init");
asm (".text");
; return 0; }
EOF
-if { (eval echo configure:1579: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_have_initfini=yes
else
@@ -1600,19 +1645,19 @@ if test $elf = yes; then
libc_cv_asm_underscores=no
else
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
-echo "configure:1604: checking for _ prefix on C symbol names" >&5
+echo "configure:1649: checking for _ prefix on C symbol names" >&5
if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1609 "configure"
+#line 1654 "configure"
#include "confdefs.h"
asm ("_glibc_foobar:");
int main() {
glibc_foobar ();
; return 0; }
EOF
-if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
libc_cv_asm_underscores=yes
else
@@ -1639,7 +1684,7 @@ if test $elf = yes; then
libc_cv_asm_weakext_directive=no
else
echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6
-echo "configure:1643: checking for assembler .weak directive" >&5
+echo "configure:1688: checking for assembler .weak directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1662,7 +1707,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
if test $libc_cv_asm_weak_directive = no; then
echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6
-echo "configure:1666: checking for assembler .weakext directive" >&5
+echo "configure:1711: checking for assembler .weakext directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1699,7 +1744,7 @@ EOF
fi
echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
-echo "configure:1703: checking for ld --no-whole-archive" >&5
+echo "configure:1748: checking for ld --no-whole-archive" >&5
if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1710,7 +1755,7 @@ __throw () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -Wl,--no-whole-archive
- -o conftest conftest.c'; { (eval echo configure:1714: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+ -o conftest conftest.c'; { (eval echo configure:1759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_ld_no_whole_archive=yes
else
libc_cv_ld_no_whole_archive=no
@@ -1721,7 +1766,7 @@ fi
echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6
echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6
-echo "configure:1725: checking for gcc -fno-exceptions" >&5
+echo "configure:1770: checking for gcc -fno-exceptions" >&5
if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1732,7 +1777,7 @@ __throw () {}
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -fno-exceptions
- -o conftest conftest.c'; { (eval echo configure:1736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+ -o conftest conftest.c'; { (eval echo configure:1781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_no_exceptions=yes
else
libc_cv_gcc_no_exceptions=no
@@ -1784,7 +1829,7 @@ if test "$uname" = generic; then
fi
echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
-echo "configure:1788: checking OS release for uname" >&5
+echo "configure:1833: checking OS release for uname" >&5
if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1806,7 +1851,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
uname_release="$libc_cv_uname_release"
echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
-echo "configure:1810: checking OS version for uname" >&5
+echo "configure:1855: checking OS version for uname" >&5
if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1828,7 +1873,7 @@ else
fi
echo $ac_n "checking stdio selection""... $ac_c" 1>&6
-echo "configure:1832: checking stdio selection" >&5
+echo "configure:1877: checking stdio selection" >&5
case $stdio in
libio) cat >> confdefs.h <<\EOF
@@ -1840,7 +1885,7 @@ esac
echo "$ac_t""$stdio" 1>&6
echo $ac_n "checking malloc selection""... $ac_c" 1>&6
-echo "configure:1844: checking malloc selection" >&5
+echo "configure:1889: checking malloc selection" >&5
case $malloc in
new-malloc) USE_NEW_MALLOC=-DUSE_NEW_MALLOC ;;
@@ -2052,6 +2097,8 @@ s%@AR@%$AR%g
s%@RANLIB@%$RANLIB%g
s%@BASH@%$BASH%g
s%@libc_cv_have_bash2@%$libc_cv_have_bash2%g
+s%@KSH@%$KSH%g
+s%@libc_cv_have_ksh@%$libc_cv_have_ksh%g
s%@libc_cv_have_initfini@%$libc_cv_have_initfini%g
s%@libc_cv_ld_no_whole_archive@%$libc_cv_ld_no_whole_archive%g
s%@libc_cv_gcc_no_exceptions@%$libc_cv_gcc_no_exceptions%g
diff --git a/configure.in b/configure.in
index 4716052ba9..7280c7a4ec 100644
--- a/configure.in
+++ b/configure.in
@@ -383,6 +383,21 @@ else
fi
AC_SUBST(libc_cv_have_bash2)
+dnl We need a ksh compatible shell for tzselect.
+if test "$BASH" = no; then
+ AC_PATH_PROG(KSH, ksh, no)
+ if test "$KSH" = no; then
+ libc_cv_have_ksh=no
+ else
+ libc_cv_have_ksh=yes
+ fi
+else
+ KSH="$BASH"
+ AC_SUBST(KSH)
+ libc_cv_have_ksh=yes
+fi
+AC_SUBST(libc_cv_have_ksh)
+
AC_CACHE_CHECK(for signed size_t type, libc_cv_signed_size_t, [dnl
echo '#include <stddef.h>
FOOBAR __SIZE_TYPE__ FOOBAR' > conftest.c
diff --git a/elf/Makefile b/elf/Makefile
index 4cb8d7e53f..8f98cb8406 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -1,6 +1,6 @@
# Makefile for elf subdirectory of GNU C Library.
-# Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+# Copyright (C) 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
@@ -100,13 +100,15 @@ $(objpfx)libdl.so: $(objpfx)libdl_pic.a $(common-objpfx)libc.so $(objpfx)ld.so
$(slibdir)/$(rtld-installed-name): $(objpfx)ld.so; $(do-install-program)
ifneq ($(have-bash2),yes)
-$(objpfx)ldd: ldd.sh.in Makefile
+$(objpfx)ldd: ldd.sh.in $(common-objpfx)version.mk \
+ $(common-objpfx)soversions.mk $(common-objpfx)config.make
sed -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \
-e 's%@VERSION@%$(version)%g' < $< > $@.new
chmod 555 $@.new
mv -f $@.new $@
else
-$(objpfx)ldd: ldd.bash.in Makefile
+$(objpfx)ldd: ldd.bash.in $(common-objpfx)version.mk \
+ $(common-objpfx)soversions.mk $(common-objpfx)config.make
sed -e 's%@BASH@%$(BASH)%g' \
-e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \
-e 's%@VERSION@%$(version)%g' \
diff --git a/glibcbug.in b/glibcbug.in
index c23f32a9ea..6473b2c7e7 100644
--- a/glibcbug.in
+++ b/glibcbug.in
@@ -29,11 +29,11 @@ trap 'rm -f $TEMP $TEMP.x' 0
PASSWD="cat /etc/passwd"
if [ -f /usr/lib/sendmail ] ; then
- RMAIL="/usr/lib/sendmail -oi -t"
+ MAIL_AGENT="/usr/lib/sendmail -oi -t"
elif [ -f /usr/sbin/sendmail ] ; then
- RMAIL="/usr/sbin/sendmail -oi -t"
+ MAIL_AGENT="/usr/sbin/sendmail -oi -t"
else
- RMAIL=rmail
+ MAIL_AGENT=rmail
fi
# Figure out how to echo a string without a trailing newline
@@ -153,8 +153,8 @@ SED_CMD='
/$PATTERN/{
s|||
s|<.*>||
-s|^[ ]*||
-s|[ ]*$||
+s|^[ ]*||
+s|[ ]*$||
p
q
}'
@@ -199,7 +199,7 @@ while :; do
*) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
esac
- [ $CNT -lt 5 ] &&
+ [ $CNT -lt 4 ] &&
echo "Errors were found with the problem report."
while :; do
@@ -239,9 +239,9 @@ sed -e "
/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
-" $TEMP > $REF
+" $TEMP > $TEMP.x
-if $MAIL_AGENT < $REF; then
+if $MAIL_AGENT $BUGGLIBC < $TEMP.x; then
echo "$COMMAND: problem report sent"
xs=0; exit
else
diff --git a/inet/arpa/inet.h b/inet/arpa/inet.h
index 561994372f..03021e614c 100644
--- a/inet/arpa/inet.h
+++ b/inet/arpa/inet.h
@@ -40,6 +40,7 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <netinet/in.h> /* To define `struct in_addr'. */
__BEGIN_DECLS
u_long inet_addr __P((const char *));
diff --git a/inet/netinet/ip.h b/inet/netinet/ip.h
index 6624ac458e..65338852ae 100644
--- a/inet/netinet/ip.h
+++ b/inet/netinet/ip.h
@@ -77,7 +77,8 @@ struct ip {
#define IPTOS_LOWDELAY 0x10
#define IPTOS_THROUGHPUT 0x08
#define IPTOS_RELIABILITY 0x04
-/* IPTOS_LOWCOST 0x02 XXX */
+#define IPTOS_LOWCOST 0x02
+#define IPTOS_MINCOST IPTOS_LOWCOST
/*
* Definitions for IP precedence (also in ip_tos) (hopefully unused)
diff --git a/libc-symbols.h b/libc-symbols.h
index 370c631f20..b583f33133 100644
--- a/libc-symbols.h
+++ b/libc-symbols.h
@@ -1,25 +1,25 @@
/* Support macros for making weak and strong aliases for symbols,
and for using symbol sets and linker warnings with GNU ld.
-Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+ Copyright (C) 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 free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY 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. */
+ 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 _LIBC_SYMBOLS_H
-#define _LIBC_SYMBOLS_H
+#define _LIBC_SYMBOLS_H 1
/* This file's macros are included implicitly in the compilation of every
file in the C library by -imacros.
@@ -225,6 +225,7 @@ extern const char _libc_intl_domainname[];
#ifdef HAVE_GNU_LD
#ifdef HAVE_ELF
#define link_warning(symbol, msg) \
+ asm(".section .gnu.warning." #symbol "; .previous"); \
static const char __evoke_link_warning_##symbol[] \
__attribute__ ((section (".gnu.warning." #symbol))) = msg;
#else
diff --git a/locale/C-time.c b/locale/C-time.c
index dbb51f383b..67254b2c53 100644
--- a/locale/C-time.c
+++ b/locale/C-time.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-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 free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY 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. */
+ 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 "localeinfo.h"
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index 335e866f91..018220f6df 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -1,21 +1,21 @@
/* localeinfo.h -- declarations for internal libc locale interfaces
-Copyright (C) 1995, 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., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ Copyright (C) 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. */
#ifndef _LOCALEINFO_H
#define _LOCALEINFO_H 1
diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c
index abd21dbc59..cc571b8a04 100644
--- a/locale/programs/ld-time.c
+++ b/locale/programs/ld-time.c
@@ -1,6 +1,6 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
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
@@ -335,7 +335,7 @@ time_finish (struct localedef_t *locale)
if (str == NULL || *str == '\0')
{
error (0, 0, _("missing era name in string %d in `era' field"
- "in category `%s'"), idx + 1, "LC_TIME");
+ " in category `%s'"), idx + 1, "LC_TIME");
time->era_entries[idx].name =
time->era_entries[idx].format = "";
}
diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c
index 4759615ec3..edb5a51f5c 100644
--- a/locale/programs/linereader.c
+++ b/locale/programs/linereader.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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 free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY 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. */
+ 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. */
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -211,7 +211,7 @@ lr_token (struct linereader *lr, const struct charset_t *charset)
lr->token.val.num += ch - '0';
}
if (isalpha (ch))
- lr_error (lr, _("garbage at end of digit"));
+ lr_error (lr, _("garbage at end of number"));
lr_ungetn (lr, 1);
return &lr->token;
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 7e71e9777a..50bba6b446 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1,5 +1,5 @@
/* Malloc implementation for multiple threads without lock contention.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>
and Doug Lea <dl@cs.oswego.edu>, 1996.
@@ -1521,7 +1521,7 @@ ptmalloc_init __MALLOC_P((void))
__malloc_hook = malloc_starter;
__free_hook = free_starter;
#endif
-#if defined(_LIBC)
+#if defined(_LIBC) && !defined (NO_THREADS)
/* Initialize the pthreads interface. */
if (__pthread_initialize != NULL)
__pthread_initialize();
diff --git a/misc/syslog.c b/misc/syslog.c
index 6e9cdef547..5521ceb9d0 100644
--- a/misc/syslog.c
+++ b/misc/syslog.c
@@ -73,7 +73,9 @@ __libc_lock_define_initialized (static, syslog_lock)
static void openlog_internal(const char *, int, int);
static void closelog_internal(void);
static void sigpipe_handler (int);
+#ifdef _LIBC_REENTRANT
static void cancel_handler (void *);
+#endif
/*
* syslog, vsyslog --
@@ -310,6 +312,7 @@ closelog ()
__libc_cleanup_region_end (1);
}
+#ifdef _LIBC_REENTRANT
static void
cancel_handler (void *ptr)
{
@@ -322,6 +325,7 @@ cancel_handler (void *ptr)
/* Free the lock. */
__libc_lock_unlock (syslog_lock);
}
+#endif
/* setlogmask -- set the log mask level */
int
diff --git a/posix/getopt.c b/posix/getopt.c
index 1cefc10820..1c79eaaae2 100644
--- a/posix/getopt.c
+++ b/posix/getopt.c
@@ -763,8 +763,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
if (opterr)
{
/* 1003.2 specifies the format of this message. */
- fprintf (stderr,
- gettext ("%s: option requires an argument -- %c\n"),
+ fprintf (stderr, _("%s: option requires an argument -- %c\n"),
argv[0], c);
}
optopt = c;
@@ -811,7 +810,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
if (ambig && !exact)
{
if (opterr)
- fprintf (stderr, gettext ("%s: option `-W %s' is ambiguous\n"),
+ fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
argv[0], argv[optind]);
nextchar += strlen (nextchar);
optind++;
@@ -829,9 +828,9 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
else
{
if (opterr)
- fprintf (stderr,
- gettext ("%s: option `-W %s' doesn't allow an argument\n"),
- argv[0], pfound->name);
+ fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
nextchar += strlen (nextchar);
return '?';
@@ -845,7 +844,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
{
if (opterr)
fprintf (stderr,
- gettext ("%s: option `%s' requires an argument\n"),
+ _("%s: option `%s' requires an argument\n"),
argv[0], argv[optind - 1]);
nextchar += strlen (nextchar);
return optstring[0] == ':' ? ':' : '?';
diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c
index 8d9d517542..374da83429 100644
--- a/resolv/nss_dns/dns-host.c
+++ b/resolv/nss_dns/dns-host.c
@@ -84,11 +84,6 @@
#include <string.h>
#include <sys/syslog.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-
#include "nsswitch.h"
/* Get implementation for some internal functions. */
@@ -126,14 +121,6 @@ enum nss_status
_nss_dns_gethostbyname2_r (const char *name, int af, 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);
querybuf host_buffer;
int size, type, n;
const char *cp;
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index f4e49e6b9d..e7c1cb8c52 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -43,7 +43,8 @@ tests := tst-printf tstscanf test_rdwr test-popen tstgetln test-fseek \
xbug errnobug \
bug1 bug2 bug3 bug4 bug5 bug6 bug7 bug8 bug9 bug10 bug11 \
tfformat tiformat tstdiomisc \
- scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10
+ scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10 \
+ scanf11
include ../Rules
diff --git a/stdio-common/bug10.c b/stdio-common/bug10.c
index 53064715ab..5e8ae25021 100644
--- a/stdio-common/bug10.c
+++ b/stdio-common/bug10.c
@@ -1,7 +1,7 @@
#include <stdio.h>
int
-main(int arc, char *argv)
+main (int arc, char *argv)
{
int n, res;
unsigned int val;
@@ -14,7 +14,7 @@ main(int arc, char *argv)
printf("Result of sscanf = %d\n", res);
printf("Scanned format %%u = %u\n", val);
printf("Possibly scanned format %%n = %d\n", n);
- result |= res != 1 || val != 111 || n != 3;
+ result |= res != 2 || val != 111 || n != 3;
result |= sscanf ("", " %n", &n) == EOF;
diff --git a/stdio-common/scanf1.c b/stdio-common/scanf1.c
index 3adf532250..58c78c2292 100644
--- a/stdio-common/scanf1.c
+++ b/stdio-common/scanf1.c
@@ -2,14 +2,14 @@
#include <stdlib.h>
int
-main(int argc, char *argv[])
+main (int argc, char *argv[])
{
int i,n,r;
n = i = r = -1;
- r = sscanf("1234:567", "%d%n", &i, &n);
- printf("%d %d %d\n", r, n, i);
- if (r != 1 || i != 1234 || n != 4)
+ r = sscanf ("1234:567", "%d%n", &i, &n);
+ printf ("%d %d %d\n", r, n, i);
+ if (r != 2 || i != 1234 || n != 4)
abort ();
return 0;
}
diff --git a/stdio-common/scanf10.c b/stdio-common/scanf10.c
index f8961378ef..27a5e66a9e 100644
--- a/stdio-common/scanf10.c
+++ b/stdio-common/scanf10.c
@@ -11,5 +11,5 @@ main (int argc, char *argv[])
printf ("retc=%d a=%d b=%d\n", retc, a, b);
- return retc == -1 && a == 6 && b == 12 ? 0 : 1;
+ return retc == 2 && a == 6 && b == 12 ? 0 : 1;
}
diff --git a/stdio-common/scanf11.c b/stdio-common/scanf11.c
new file mode 100644
index 0000000000..50ef26aded
--- /dev/null
+++ b/stdio-common/scanf11.c
@@ -0,0 +1,14 @@
+/* This test comes from ISO C Corrigendum 1. */
+#include <stdio.h>
+
+int
+main (int argc, char *argv[])
+{
+ int d1, n1, n2, i;
+#define NOISE 1234567
+ int d2 = NOISE;
+
+ i = sscanf ("123", "%d%n%n%d", &d1, &n1, &n2, &d2);
+
+ return i != 3 || d1 != 123 || n1 != 3 || n2 != 3 || d2 != NOISE;
+}
diff --git a/stdio-common/scanf3.c b/stdio-common/scanf3.c
index 33495cca79..5bfa80b62f 100644
--- a/stdio-common/scanf3.c
+++ b/stdio-common/scanf3.c
@@ -13,7 +13,7 @@ main(int arc, char *argv[])
printf("Result of sscanf = %d\n", res);
printf("Scanned format %%u = %u\n", val);
printf("Possibly scanned format %%n = %d\n", n);
- if (n != 3 || val != 111 || res != 1)
+ if (n != 3 || val != 111 || res != 2)
abort ();
val = n = -1;
@@ -21,7 +21,7 @@ main(int arc, char *argv[])
printf("Result of sscanf = %d\n", res);
printf("Scanned format %%u = %u\n", val);
printf("Possibly scanned format %%n = %d\n", n);
- if (n != 3 || val != 111 || res != 1)
+ if (n != 3 || val != 111 || res != 2)
abort ();
return 0;
diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c
index 8dac4f2039..dbce6237c9 100644
--- a/stdio-common/tstdiomisc.c
+++ b/stdio-common/tstdiomisc.c
@@ -27,7 +27,7 @@ t2 (void)
SCAN ("12345", "%ld", N, 1, 12345);
SCAN ("12345", "%llllld", N, 0, -1);
SCAN ("12345", "%LLLLLd", N, 0, -1);
- SCAN ("test ", "%*s%n", n, 0, 4);
+ SCAN ("test ", "%*s%n", n, 1, 4);
SCAN ("test ", "%2*s%n", n, 0, -1);
SCAN ("12 ", "%l2d", n, 0, -1);
SCAN ("12 ", "%2ld", N, 1, 12);
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index cb6d39629e..ef0dbeea32 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -452,15 +452,18 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
/* Corrigendum 1 to ISO C 1990 describes the allowed flags
with the 'n' conversion specifier. */
if (!(flags & SUPPRESS))
- /* Don't count the read-ahead. */
- if (flags & LONGDBL)
- *ARG (long long int *) = read_in;
- else if (flags & LONG)
- *ARG (long int *) = read_in;
- else if (flags & SHORT)
- *ARG (short int *) = read_in;
- else
- *ARG (int *) = read_in;
+ {
+ /* Don't count the read-ahead. */
+ if (flags & LONGDBL)
+ *ARG (long long int *) = read_in;
+ else if (flags & LONG)
+ *ARG (long int *) = read_in;
+ else if (flags & SHORT)
+ *ARG (short int *) = read_in;
+ else
+ *ARG (int *) = read_in;
+ ++done;
+ }
break;
case 'c': /* Match characters. */
diff --git a/stdlib/strtol.c b/stdlib/strtol.c
index 5a097b40a4..396e2ecd74 100644
--- a/stdlib/strtol.c
+++ b/stdlib/strtol.c
@@ -1,5 +1,5 @@
/* strtol - Convert string representation of a number into an integer value.
- Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc.
+ Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -217,13 +217,8 @@ INTERNAL (strtol) (nptr, endptr, base, group)
/* Check for a sign. */
if (*s == L_('-'))
{
-#if UNSIGNED
- __set_errno (EINVAL);
- return 0;
-#else
negative = 1;
++s;
-#endif
}
else if (*s == L_('+'))
{
@@ -317,6 +312,8 @@ INTERNAL (strtol) (nptr, endptr, base, group)
? -((unsigned LONG int) (LONG_MIN + 1)) + 1
: (unsigned LONG int) LONG_MAX))
overflow = 1;
+#else
+ overflow |= negative;
#endif
if (overflow)
diff --git a/stdlib/tst-strtol.c b/stdlib/tst-strtol.c
index 58878f236e..1d398b4558 100644
--- a/stdlib/tst-strtol.c
+++ b/stdlib/tst-strtol.c
@@ -37,8 +37,8 @@ static const struct ltest tests[] =
{ " 0", 0, 0, 0, 0 },
{ "0xffffffffg", 0xffffffff, 0, 'g', 0 },
{ "0xf1f2f3f4f5", 0xffffffff, 0, 0, ERANGE },
- { "-0x123456789", 0, 0, 0, EINVAL },
- { "-0xfedcba98", 0, 0, 0, EINVAL },
+ { "-0x123456789", 0xffffffff, 0, 0, ERANGE },
+ { "-0xfedcba98", 0xffffffff, 0, 0, ERANGE },
{ NULL, 0, 0, 0, 0 },
#else
/* assume 64 bit long... */
@@ -65,8 +65,8 @@ static const struct ltest tests[] =
{ "0xffffffffg", 0xffffffff, 0, 'g', 0 },
{ "0xffffffffffffffffg", 0xffffffffffffffff, 0, 'g', 0 },
{ "0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffff, 0, 0, ERANGE },
- { "-0x123456789abcdef01", 0, 0, 0, EINVAL },
- { "-0xfedcba987654321", 0, 0, 0, EINVAL },
+ { "-0x123456789abcdef01", 0xffffffffffffffff, 0, 0, ERANGE },
+ { "-0xfedcba987654321", 0xffffffffffffffff, 0, 0, ERANGE },
{ NULL, 0, 0, 0, 0 },
#endif
};
diff --git a/sysdeps/generic/sysd-stdio.c b/sysdeps/generic/sysd-stdio.c
index d28dde87f1..363a763449 100644
--- a/sysdeps/generic/sysd-stdio.c
+++ b/sysdeps/generic/sysd-stdio.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU 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 free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY 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. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <stddef.h>
#include <stdio.h>
@@ -163,7 +163,7 @@ __stdio_open (filename, m, cookieptr)
/* Open FILENAME with the mode in M. Use the same magic cookie
already in *COOKIEPTR if possible, closing the old cookie with CLOSEFN. */
int
-__stdio_reopen (filename, m, cookieptr)
+__stdio_reopen (filename, m, cookieptr, closefn)
const char *filename;
__io_mode m;
void **cookieptr;
diff --git a/sysdeps/libm-i387/e_exp.S b/sysdeps/libm-i387/e_exp.S
index 3c9d45b746..e76b9c63df 100644
--- a/sysdeps/libm-i387/e_exp.S
+++ b/sysdeps/libm-i387/e_exp.S
@@ -24,7 +24,7 @@ ENTRY(__ieee754_exp)
fmulp /* x * log2(e) */
fstl %st(1)
frndint /* int(x * log2(e)) */
- fsub %st,%st(1) /* fract(x * log2(e)) */
+ fsubr %st,%st(1) /* fract(x * log2(e)) */
fxch
f2xm1 /* 2^(fract(x * log2(e))) - 1 */
fld1
diff --git a/sysdeps/libm-i387/e_expf.S b/sysdeps/libm-i387/e_expf.S
index cd8dc7f0b9..9a669cf8d4 100644
--- a/sysdeps/libm-i387/e_expf.S
+++ b/sysdeps/libm-i387/e_expf.S
@@ -25,7 +25,7 @@ ENTRY(__ieee754_expf)
fmulp /* x * log2(e) */
fstl %st(1)
frndint /* int(x * log2(e)) */
- fsub %st,%st(1) /* fract(x * log2(e)) */
+ fsubr %st,%st(1) /* fract(x * log2(e)) */
fxch
f2xm1 /* 2^(fract(x * log2(e))) - 1 */
fld1
diff --git a/sysdeps/libm-i387/e_expl.S b/sysdeps/libm-i387/e_expl.S
index e398a90ef6..e83d30640d 100644
--- a/sysdeps/libm-i387/e_expl.S
+++ b/sysdeps/libm-i387/e_expl.S
@@ -26,7 +26,7 @@ ENTRY(__ieee754_expl)
fmulp /* x * log2(e) */
fstl %st(1)
frndint /* int(x * log2(e)) */
- fsub %st,%st(1) /* fract(x * log2(e)) */
+ fsubr %st,%st(1) /* fract(x * log2(e)) */
fxch
f2xm1 /* 2^(fract(x * log2(e))) - 1 */
fld1
diff --git a/sysdeps/libm-i387/s_expm1.S b/sysdeps/libm-i387/s_expm1.S
index 2685d6e770..78e8013b7e 100644
--- a/sysdeps/libm-i387/s_expm1.S
+++ b/sysdeps/libm-i387/s_expm1.S
@@ -1,8 +1,9 @@
/* ix87 specific implementation of exp(x)-1.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>.
+ Corrections by H.J. Lu (hjl@gnu.ai.mit.edu), 1997.
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
@@ -64,15 +65,16 @@ ENTRY(__expm1)
fmulp // log2(e)*x
fld %st // log2(e)*x : log2(e)*x
frndint // int(log2(e)*x) : log2(e)*x
- fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
+ fsubr %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
fxch // fract(log2(e)*x) : int(log2(e)*x)
f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x)
fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x)
fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
- fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
- faddp // 2^(log2(e)*x)
- fsubl MO(one)
+ fscale // 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fsubrp %st, %st(1) // 2^(log2(e)*x)
ret
2: testl $0x200, %eax // Test sign.
diff --git a/sysdeps/libm-i387/s_expm1f.S b/sysdeps/libm-i387/s_expm1f.S
index 85c3c849f1..00f1562e73 100644
--- a/sysdeps/libm-i387/s_expm1f.S
+++ b/sysdeps/libm-i387/s_expm1f.S
@@ -1,8 +1,9 @@
/* ix87 specific implementation of exp(x)-1.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>.
+ Corrections by H.J. Lu (hjl@gnu.ai.mit.edu), 1997.
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
@@ -64,15 +65,16 @@ ENTRY(__expm1f)
fmulp // log2(e)*x
fld %st // log2(e)*x : log2(e)*x
frndint // int(log2(e)*x) : log2(e)*x
- fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
+ fsubr %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
fxch // fract(log2(e)*x) : int(log2(e)*x)
f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x)
fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x)
fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
- fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
- faddp // 2^(log2(e)*x)
- fsubl MO(one)
+ fscale // 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fsubrp %st, %st(1) // 2^(log2(e)*x)
ret
2: testl $0x200, %eax // Test sign.
diff --git a/sysdeps/libm-i387/s_expm1l.S b/sysdeps/libm-i387/s_expm1l.S
index 45aa753094..b7e6b36d39 100644
--- a/sysdeps/libm-i387/s_expm1l.S
+++ b/sysdeps/libm-i387/s_expm1l.S
@@ -1,8 +1,9 @@
/* ix87 specific implementation of exp(x)-1.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>.
+ Corrections by H.J. Lu (hjl@gnu.ai.mit.edu), 1997.
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
@@ -64,15 +65,16 @@ ENTRY(__expm1l)
fmulp // log2(e)*x
fld %st // log2(e)*x : log2(e)*x
frndint // int(log2(e)*x) : log2(e)*x
- fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
+ fsubr %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
fxch // fract(log2(e)*x) : int(log2(e)*x)
f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x)
fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x)
fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
- fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
- faddp // 2^(log2(e)*x)
- fsubl MO(one)
+ fscale // 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fsubrp %st, %st(1) // 2^(log2(e)*x)
ret
2: testl $0x200, %eax // Test sign.
diff --git a/sysdeps/mach/hurd/posix_opt.h b/sysdeps/mach/hurd/posix_opt.h
index 75a07e1539..045b4b6666 100644
--- a/sysdeps/mach/hurd/posix_opt.h
+++ b/sysdeps/mach/hurd/posix_opt.h
@@ -1,3 +1,12 @@
+/* Posix options supported by the GNU Hurd port of GNU libc. */
+
+#define _POSIX_JOB_CONTROL 1
+#define _POSIX_SAVED_IDS 1
+#define _POSIX_VDISABLE ((unsigned char) -1)
+
+/* Different Hurd filesystems might do these differently. */
+#undef _POSIX_CHOWN_RESTRICTED
+#undef _POSIX_NO_TRUNC
/* Posix options supported by the GNU Hurd port of GNU libc. */
#define _POSIX_JOB_CONTROL 1
diff --git a/sysdeps/mach/hurd/vdprintf.c b/sysdeps/mach/hurd/vdprintf.c
index 002f8c630a..a69607e663 100644
--- a/sysdeps/mach/hurd/vdprintf.c
+++ b/sysdeps/mach/hurd/vdprintf.c
@@ -55,3 +55,60 @@ vdprintf (int d, const char *format, va_list arg)
return done;
}
+/* Copyright (C) 1991, 1992, 1993, 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <hurd/fd.h>
+
+/* Write formatted output to file descriptor D according to the format string
+ FORMAT, using the argument list in ARG. */
+int
+vdprintf (int d, const char *format, va_list arg)
+{
+ int done;
+ FILE f;
+ struct hurd_fd *fd;
+
+ HURD_CRITICAL_BEGIN;
+ fd = _hurd_fd_get (fd);
+ HURD_CRITICAL_END;
+
+ if (!fd)
+ return 0;
+
+ /* Create an unbuffered stream talking to D on the stack. */
+ memset ((PTR) &f, 0, sizeof(f));
+ f.__magic = _IOMAGIC;
+ f.__mode.__write = 1;
+ f.__cookie = fd;
+ f.__room_funcs = __default_room_functions;
+ f.__io_funcs = __default_io_functions;
+ f.__seen = 1;
+ f.__userbuf = 1;
+
+ /* vfprintf will use a buffer on the stack for the life of the call,
+ and flush it when finished. */
+ done = vfprintf (&f, format, arg);
+
+ return done;
+}
diff --git a/sysdeps/mach/libc-lock.h b/sysdeps/mach/libc-lock.h
index 53dc8ee9e0..05eb70c56f 100644
--- a/sysdeps/mach/libc-lock.h
+++ b/sysdeps/mach/libc-lock.h
@@ -1,21 +1,21 @@
/* libc-internal interface for mutex locks. Mach cthreads version.
-Copyright (C) 1996, 1997 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+ 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 free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY 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. */
+ 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 _LIBC_LOCK_H
#define _LIBC_LOCK_H 1
@@ -87,4 +87,12 @@ typedef struct __libc_lock_opaque__ __libc_lock_t;
#define __libc_lock_unlock_recursive __libc_lock_unlock
#define __libc_lock_lock_recursive __libc_lock_lock
+/* XXX until cthreads supports recursive locks */
+#define __libc_lock_define_initialized_recursive __libc_lock_define_initialized
+#define __libc_lock_init_recursive __libc_lock_init
+#define __libc_lock_fini_recursive __libc_lock_fini
+#define __libc_lock_trylock_recursive __libc_lock_trylock
+#define __libc_lock_unlock_recursive __libc_lock_unlock
+#define __libc_lock_lock_recursive __libc_lock_lock
+
#endif /* libc-lock.h */
diff --git a/sysdeps/posix/vdprintf.c b/sysdeps/posix/vdprintf.c
index 5147bb84bc..1cb05723b4 100644
--- a/sysdeps/posix/vdprintf.c
+++ b/sysdeps/posix/vdprintf.c
@@ -47,3 +47,52 @@ vdprintf (int d, const char *format, va_list arg)
return done;
}
+/* Copyright (C) 1991, 1992, 1993, 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+
+/* Write formatted output to file descriptor D according to the format string
+ FORMAT, using the argument list in ARG. */
+int
+vdprintf (int d, const char *format, va_list arg)
+{
+ int done;
+ FILE f;
+
+ /* Create an unbuffered stream talking to D on the stack. */
+ memset ((PTR) &f, 0, sizeof(f));
+ f.__magic = _IOMAGIC;
+ f.__mode.__write = 1;
+ f.__cookie = (PTR) (long int) d; /* Casting to long quiets GCC on Alpha. */
+ f.__room_funcs = __default_room_functions;
+ f.__io_funcs = __default_io_functions;
+ f.__seen = 1;
+ f.__userbuf = 1;
+
+ /* vfprintf will use a buffer on the stack for the life of the call,
+ and flush it when finished. */
+ done = vfprintf (&f, format, arg);
+
+ return done;
+}
diff --git a/sysdeps/stub/vdprintf.c b/sysdeps/stub/vdprintf.c
index 729f0123ca..f7ae121097 100644
--- a/sysdeps/stub/vdprintf.c
+++ b/sysdeps/stub/vdprintf.c
@@ -29,3 +29,34 @@ vdprintf (int d, const char *format, va_list arg)
}
stub_warning (vdprintf)
+/* 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 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. */
+
+#include <errno.h>
+#include <stdio.h>
+
+/* Write formatted output to file descriptor D according to the format string
+ FORMAT, using the argument list in ARG. */
+int
+vdprintf (int d, const char *format, va_list arg)
+{
+ __set_errno (ENOSYS);
+ return NULL;
+}
+
+stub_warning (vdprintf)
diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile
index 15993b34ac..1aea477064 100644
--- a/sysdeps/unix/Makefile
+++ b/sysdeps/unix/Makefile
@@ -289,7 +289,7 @@ $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
test -f $$dir/syscalls.list && \
{ $(SHELL) $(dir $<)$(notdir $<) \
$$dir $(object-suffixes) || exit 1; }; \
- test $$dir = sysdeps/unix && break; \
+ test $$dir = $(..)sysdeps/unix && break; \
done > $@T
mv -f $@T $@
diff --git a/sysdeps/unix/bsd/bsd4.4/direntry.h b/sysdeps/unix/bsd/bsd4.4/direntry.h
index c221d55c0d..b9e0d7277e 100644
--- a/sysdeps/unix/bsd/bsd4.4/direntry.h
+++ b/sysdeps/unix/bsd/bsd4.4/direntry.h
@@ -1,21 +1,21 @@
/* Directory entry structure `struct dirent'. 4.4BSD version.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+ 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 free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY 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. */
+ 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. */
struct dirent
{
diff --git a/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h b/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h
new file mode 100644
index 0000000000..900bff4aab
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h
@@ -0,0 +1,7 @@
+/* This is the sigaction struction from the Linux 2.1.20 kernel. */
+
+struct kernel_sigaction {
+ __sighandler_t sa_handler;
+ unsigned long sa_mask;
+ unsigned int sa_flags;
+};
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h b/sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h
new file mode 100644
index 0000000000..57830daae1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h
@@ -0,0 +1,85 @@
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
+
+ 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_IPC_BUF_H
+
+#define _SYS_IPC_BUF_H 1
+#include <features.h>
+
+#include <sys/types.h>
+
+/* Mode bits for `msgget', `semget', and `shmget'. */
+#define IPC_CREAT 01000 /* Create key if key does not exist. */
+#define IPC_EXCL 02000 /* Fail if key exists. */
+#define IPC_NOWAIT 04000 /* Return error on wait. */
+
+/* Control commands for `msgctl', `semctl', and `shmctl'. */
+#define IPC_RMID 0 /* Remove identifier. */
+#define IPC_SET 1 /* Set `ipc_perm' options. */
+#define IPC_STAT 2 /* Get `ipc_perm' options. */
+#define IPC_INFO 3 /* See ipcs. */
+
+
+__BEGIN_DECLS
+
+/* Special key values. */
+#define IPC_PRIVATE ((__key_t) 0) /* Private key. */
+
+
+/* Data structure used to pass permission information to IPC operations. */
+struct ipc_perm
+ {
+ __key_t __key; /* Key. */
+ unsigned int uid; /* Owner's user ID. */
+ unsigned int gid; /* Owner's group ID. */
+ unsigned int cuid; /* Creator's user ID. */
+ unsigned int cgid; /* Creator's group ID. */
+ unsigned int mode; /* Read/write permission. */
+ unsigned short int __seq; /* Sequence number. */
+ };
+
+
+/* Kludge to work around Linux' restriction of only up to five
+ arguments to a system call. */
+struct ipc_kludge
+ {
+ void *msgp;
+ long int msgtyp;
+ };
+
+/* The actual system call: all functions are multiplexed by this. */
+extern int __ipc __P ((int __call, int __first, int __second, int __third,
+ void *__ptr));
+
+/* The codes for the functions to use the multiplexer `__ipc'. */
+#define IPCOP_semop 1
+#define IPCOP_semget 2
+#define IPCOP_semctl 3
+#define IPCOP_msgsnd 11
+#define IPCOP_msgrcv 12
+#define IPCOP_msgget 13
+#define IPCOP_msgctl 14
+#define IPCOP_shmat 21
+#define IPCOP_shmdt 22
+#define IPCOP_shmget 23
+#define IPCOP_shmctl 24
+
+__END_DECLS
+
+#endif /* _SYS_IPC_BUF_H */
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/procfs.h b/sysdeps/unix/sysv/linux/alpha/sys/procfs.h
new file mode 100644
index 0000000000..03af029254
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/sys/procfs.h
@@ -0,0 +1,109 @@
+/* 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. */
+
+#ifndef _SYS_PROCFS_H
+
+#define _SYS_PROCFS_H 1
+#include <features.h>
+
+/* This is somehow modelled after the file of the same name on SysVr4
+ systems. It provides a definition of the core file format for ELF
+ used on Linux. */
+
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <asm/user.h>
+#include <asm/elf.h>
+
+__BEGIN_DECLS
+
+struct elf_siginfo
+ {
+ int si_signo; /* Signal number. */
+ int si_code; /* Extra code. */
+ int si_errno; /* Errno. */
+ };
+
+typedef elf_greg_t greg_t;
+typedef elf_gregset_t gregset_t;
+typedef elf_fpregset_t fpregset_t;
+#define NGREG ELF_NGREG
+
+/* Definitions to generate Intel SVR4-like core files. These mostly
+ have the same names as the SVR4 types with "elf_" tacked on the
+ front to prevent clashes with linux definitions, and the typedef
+ forms have been avoided. This is mostly like the SVR4 structure,
+ but more Linuxy, with things that Linux does not support and which
+ gdb doesn't really use excluded. Fields present but not used are
+ marked with "XXX". */
+struct elf_prstatus
+ {
+#if 0
+ long int pr_flags; /* XXX Process flags. */
+ short int pr_why; /* XXX Reason for process halt. */
+ short int pr_what; /* XXX More detailed reason. */
+#endif
+ struct elf_siginfo pr_info; /* Info associated with signal. */
+ short int pr_cursig; /* Current signal. */
+ unsigned long int pr_sigpend; /* Set of pending signals. */
+ unsigned long int pr_sighold; /* Set of held signals. */
+#if 0
+ struct sigaltstack pr_altstack; /* Alternate stack info. */
+ struct sigaction pr_action; /* Signal action for current sig. */
+#endif
+ __pid_t pr_pid;
+ __pid_t pr_ppid;
+ __pid_t pr_pgrp;
+ __pid_t pr_sid;
+ struct timeval pr_utime; /* User time. */
+ struct timeval pr_stime; /* System time. */
+ struct timeval pr_cutime; /* Cumulative user time. */
+ struct timeval pr_cstime; /* Cumulative system time. */
+#if 0
+ long int pr_instr; /* Current instruction. */
+#endif
+ elf_gregset_t pr_reg; /* GP registers. */
+ int pr_fpvalid; /* True if math copro being used. */
+ };
+
+
+#define ELF_PRARGSZ (80) /* Number of chars for args */
+
+struct elf_prpsinfo
+ {
+ char pr_state; /* Numeric process state. */
+ char pr_sname; /* Char for pr_state. */
+ char pr_zomb; /* Zombie. */
+ char pr_nice; /* Nice val. */
+ unsigned long int pr_flag; /* Flags. */
+ unsigned int pr_uid;
+ unsigned int pr_gid;
+ unsigned int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+ /* Lots missing */
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
+ };
+
+
+typedef struct elf_prstatus prstatus_t;
+typedef struct elf_prpsinfo prpsinfo_t;
+
+__END_DECLS
+
+#endif /* sys/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/i386/getgroups.c b/sysdeps/unix/sysv/linux/i386/getgroups.c
new file mode 100644
index 0000000000..2b8f9575fb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/getgroups.c
@@ -0,0 +1,43 @@
+/* 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 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 <sys/types.h>
+#include <unistd.h>
+
+#include <linux/posix_types.h>
+
+extern int __syscall_getgroups __P ((int, __kernel_gid_t *));
+
+/* For Linux we must convert the array of groups from the format that the
+ kernel returns. */
+int
+__getgroups (n, groups)
+ int n;
+ gid_t *groups;
+{
+ int i, ngids;
+ __kernel_gid_t kernel_groups[n];
+
+ ngids = __syscall_getgroups (n, kernel_groups);
+ if (n != 0 && ngids > 0)
+ for (i = 0; i < ngids; i++)
+ groups[i] = kernel_groups[i];
+ return ngids;
+}
+
+weak_alias (__getgroups, getgroups)
diff --git a/sysdeps/unix/sysv/linux/i386/setgroups.c b/sysdeps/unix/sysv/linux/i386/setgroups.c
new file mode 100644
index 0000000000..8f8711913e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/setgroups.c
@@ -0,0 +1,41 @@
+/* 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 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 <sys/types.h>
+#include <unistd.h>
+#include <grp.h>
+
+#include <linux/posix_types.h>
+
+extern int __syscall_setgroups __P ((int, const __kernel_gid_t *));
+
+/* Set the group set for the current user to GROUPS (N of them). For
+ Linux we must convert the array of groups into the format that the
+ kernel expects. */
+int
+setgroups (n, groups)
+ size_t n;
+ const gid_t *groups;
+{
+ size_t i;
+ __kernel_gid_t kernel_groups[n];
+
+ for (i = 0; i < n; i++)
+ kernel_groups[i] = groups[i];
+ return __syscall_setgroups (n, kernel_groups);
+}
diff --git a/sysdeps/unix/sysv/linux/i386/syscalls.list b/sysdeps/unix/sysv/linux/i386/syscalls.list
index d95a120aa0..392a257194 100644
--- a/sysdeps/unix/sysv/linux/i386/syscalls.list
+++ b/sysdeps/unix/sysv/linux/i386/syscalls.list
@@ -1,4 +1,6 @@
# File name Caller Syscall name # args Strong name Weak names
+s_getgroups getgroups getgroups 2 __syscall_getgroups
s_llseek llseek _llseek 5 __sys_llseek
+s_setgroups setgroups setgroups 2 __syscall_setgroups
vm86 - vm86 1 __vm86 vm86
diff --git a/sysdeps/unix/sysv/linux/kernel_sigaction.h b/sysdeps/unix/sysv/linux/kernel_sigaction.h
new file mode 100644
index 0000000000..a058642d85
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/kernel_sigaction.h
@@ -0,0 +1,10 @@
+/* This is the sigaction structure from the Linux 2.1.20 kernel. */
+
+#define HAVE_SA_RESTORER
+
+struct kernel_sigaction {
+ __sighandler_t sa_handler;
+ unsigned long sa_mask;
+ unsigned long sa_flags;
+ void (*sa_restorer) __P ((void));
+};
diff --git a/sysdeps/unix/sysv/linux/m68k/getgroups.c b/sysdeps/unix/sysv/linux/m68k/getgroups.c
new file mode 100644
index 0000000000..102ea24e14
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/getgroups.c
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type. */
+#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
diff --git a/sysdeps/unix/sysv/linux/m68k/setgroups.c b/sysdeps/unix/sysv/linux/m68k/setgroups.c
new file mode 100644
index 0000000000..0e7086278f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/setgroups.c
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type. */
+#include <sysdeps/unix/sysv/linux/i386/setgroups.c>
diff --git a/sysdeps/unix/sysv/linux/m68k/syscalls.list b/sysdeps/unix/sysv/linux/m68k/syscalls.list
index 7883d70719..9a3e4d0e58 100644
--- a/sysdeps/unix/sysv/linux/m68k/syscalls.list
+++ b/sysdeps/unix/sysv/linux/m68k/syscalls.list
@@ -1,3 +1,5 @@
# File name Caller Syscall name # args Strong name Weak names
+s_getgroups getgroups getgroups 2 __syscall_getgroups
s_llseek llseek _llseek 5 __sys_llseek
+s_setgroups setgroups setgroups 2 __syscall_setgroups
diff --git a/sysdeps/unix/sysv/linux/sigaction.c b/sysdeps/unix/sysv/linux/sigaction.c
new file mode 100644
index 0000000000..a7b3e07dae
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigaction.c
@@ -0,0 +1,63 @@
+/* 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 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 <signal.h>
+
+/* The difference here is that the sigaction structure used in the
+ kernel is not the same as we use in the libc. Therefore we must
+ translate it here. */
+#include <kernel_sigaction.h>
+
+extern int __syscall_sigaction (int, const struct kernel_sigaction *,
+ struct kernel_sigaction *);
+
+/* If ACT is not NULL, change the action for SIG to *ACT.
+ If OACT is not NULL, put the old action for SIG in *OACT. */
+int
+__sigaction (sig, act, oact)
+ int sig;
+ const struct sigaction *act;
+ struct sigaction *oact;
+{
+ struct kernel_sigaction k_sigact, k_osigact;
+ int error;
+
+ if (act)
+ {
+ k_sigact.sa_handler = act->sa_handler;
+ k_sigact.sa_mask = act->sa_mask.__val[0];
+ k_sigact.sa_flags = act->sa_flags;
+#ifdef HAVE_SA_RESTORER
+ k_sigact.sa_restorer = act->sa_restorer;
+#endif
+ }
+ error = __syscall_sigaction (sig, act ? &k_sigact : 0,
+ oact ? &k_osigact : 0);
+ if (oact && error >= 0)
+ {
+ oact->sa_handler = k_osigact.sa_handler;
+ oact->sa_mask.__val[0] = k_osigact.sa_mask;
+ oact->sa_flags = k_osigact.sa_flags;
+#ifdef HAVE_SA_RESTORER
+ oact->sa_restorer = k_osigact.sa_restorer;
+#endif
+ }
+ return error;
+}
+
+weak_alias (__sigaction, sigaction)
diff --git a/sysdeps/unix/sysv/linux/sys/ipc_buf.h b/sysdeps/unix/sysv/linux/sys/ipc_buf.h
index a1eba68113..f5fea0d295 100644
--- a/sysdeps/unix/sysv/linux/sys/ipc_buf.h
+++ b/sysdeps/unix/sysv/linux/sys/ipc_buf.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -25,43 +25,43 @@
#include <sys/types.h>
/* Mode bits for `msgget', `semget', and `shmget'. */
-#define IPC_CREAT 01000 /* create key if key does not exist */
-#define IPC_EXCL 02000 /* fail if key exists */
-#define IPC_NOWAIT 04000 /* return error on wait */
+#define IPC_CREAT 01000 /* Create key if key does not exist. */
+#define IPC_EXCL 02000 /* Fail if key exists. */
+#define IPC_NOWAIT 04000 /* Return error on wait. */
/* Control commands for `msgctl', `semctl', and `shmctl'. */
-#define IPC_RMID 0 /* remove identifier */
-#define IPC_SET 1 /* set `ipc_perm' options */
-#define IPC_STAT 2 /* get `ipc_perm' options */
-#define IPC_INFO 3 /* see ipcs */
+#define IPC_RMID 0 /* Remove identifier. */
+#define IPC_SET 1 /* Set `ipc_perm' options. */
+#define IPC_STAT 2 /* Get `ipc_perm' options. */
+#define IPC_INFO 3 /* See ipcs. */
__BEGIN_DECLS
/* Special key values. */
-#define IPC_PRIVATE ((key_t) 0) /* private key */
+#define IPC_PRIVATE ((__key_t) 0) /* Private key. */
/* Data structure used to pass permission information to IPC operations. */
struct ipc_perm
-{
- key_t __key; /* key */
- __uid_t uid; /* owner's user ID */
- __gid_t gid; /* owner's group ID */
- __uid_t cuid; /* creator's user ID */
- __gid_t cgid; /* creator's group ID */
- __mode_t mode; /* read/write permission */
- unsigned short int __seq; /* sequence number */
-};
+ {
+ __key_t __key; /* Key. */
+ unsigned short int uid; /* Owner's user ID. */
+ unsigned short int gid; /* Owner's group ID. */
+ unsigned short int cuid; /* Creator's user ID. */
+ unsigned short int cgid; /* Creator's group ID. */
+ unsigned short int mode; /* Read/write permission. */
+ unsigned short int __seq; /* Sequence number. */
+ };
/* Kludge to work around Linux' restriction of only up to five
arguments to a system call. */
struct ipc_kludge
-{
- void *msgp;
- long msgtyp;
-};
+ {
+ void *msgp;
+ long int msgtyp;
+ };
/* The actual system call: all functions are multiplexed by this. */
extern int __ipc __P ((int __call, int __first, int __second, int __third,
diff --git a/sysdeps/unix/sysv/linux/sys/mtio.h b/sysdeps/unix/sysv/linux/sys/mtio.h
index 45db6a51b4..e238ef92d7 100644
--- a/sysdeps/unix/sysv/linux/sys/mtio.h
+++ b/sysdeps/unix/sysv/linux/sys/mtio.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Structures and definitions for magnetic tape I/O control commands.
+ 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
@@ -16,13 +17,250 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+/* Written by H. Bergman <hennus@cybercomm.nl>. */
+
#ifndef _SYS_MTIO_H
#define _SYS_MTIO_H 1
/* Get necessary definitions from system and kernel headers. */
#include <sys/types.h>
#include <sys/ioctl.h>
-#include <linux/mtio.h>
+
+
+/* Structure for MTIOCTOP - magnetic tape operation command. */
+struct mtop
+ {
+ short int mt_op; /* Operations defined below. */
+ int mt_count; /* How many of them. */
+ };
+
+/* Magnetic Tape operations [Not all operations supported by all drivers]. */
+#define MTRESET 0 /* +reset drive in case of problems. */
+#define MTFSF 1 /* Forward space over FileMark,
+ * position at first record of next file. */
+#define MTBSF 2 /* Backward space FileMark (position before FM). */
+#define MTFSR 3 /* Forward space record. */
+#define MTBSR 4 /* Backward space record. */
+#define MTWEOF 5 /* Write an end-of-file record (mark). */
+#define MTREW 6 /* Rewind. */
+#define MTOFFL 7 /* Rewind and put the drive offline (eject?). */
+#define MTNOP 8 /* No op, set status only (read with MTIOCGET). */
+#define MTRETEN 9 /* Retension tape. */
+#define MTBSFM 10 /* +backward space FileMark, position at FM. */
+#define MTFSFM 11 /* +forward space FileMark, position at FM. */
+#define MTEOM 12 /* Goto end of recorded media (for appending files).
+ MTEOM positions after the last FM, ready for
+ appending another file. */
+#define MTERASE 13 /* Erase tape -- be careful! */
+
+#define MTRAS1 14 /* Run self test 1 (nondestructive). */
+#define MTRAS2 15 /* Run self test 2 (destructive). */
+#define MTRAS3 16 /* Reserved for self test 3. */
+
+#define MTSETBLK 20 /* Set block length (SCSI). */
+#define MTSETDENSITY 21 /* Set tape density (SCSI). */
+#define MTSEEK 22 /* Seek to block (Tandberg, etc.). */
+#define MTTELL 23 /* Tell block (Tandberg, etc.). */
+#define MTSETDRVBUFFER 24 /* Set the drive buffering according to SCSI-2.
+ Ordinary buffered operation with code 1. */
+#define MTFSS 25 /* Space forward over setmarks. */
+#define MTBSS 26 /* Space backward over setmarks. */
+#define MTWSM 27 /* Write setmarks. */
+
+#define MTLOCK 28 /* Lock the drive door. */
+#define MTUNLOCK 29 /* Unlock the drive door. */
+#define MTLOAD 30 /* Execute the SCSI load command. */
+#define MTUNLOAD 31 /* Execute the SCSI unload command. */
+#define MTCOMPRESSION 32/* Control compression with SCSI mode page 15. */
+#define MTSETPART 33 /* Change the active tape partition. */
+#define MTMKPART 34 /* Format the tape with one or two partitions. */
+
+/* structure for MTIOCGET - mag tape get status command */
+
+struct mtget
+ {
+ long int mt_type; /* Type of magtape device. */
+ long int mt_resid; /* Residual count: (not sure)
+ number of bytes ignored, or
+ number of files not skipped, or
+ number of records not skipped. */
+ /* The following registers are device dependent. */
+ long int mt_dsreg; /* Status register. */
+ long int mt_gstat; /* Generic (device independent) status. */
+ long int mt_erreg; /* Error register. */
+ /* The next two fields are not always used. */
+ __daddr_t mt_fileno; /* Number of current file on tape. */
+ __daddr_t mt_blkno; /* Current block number. */
+ };
+
+
+
+/* Constants for mt_type. Not all of these are supported, and
+ these are not all of the ones that are supported. */
+#define MT_ISUNKNOWN 0x01
+#define MT_ISQIC02 0x02 /* Generic QIC-02 tape streamer. */
+#define MT_ISWT5150 0x03 /* Wangtek 5150EQ, QIC-150, QIC-02. */
+#define MT_ISARCHIVE_5945L2 0x04 /* Archive 5945L-2, QIC-24, QIC-02?. */
+#define MT_ISCMSJ500 0x05 /* CMS Jumbo 500 (QIC-02?). */
+#define MT_ISTDC3610 0x06 /* Tandberg 6310, QIC-24. */
+#define MT_ISARCHIVE_VP60I 0x07 /* Archive VP60i, QIC-02. */
+#define MT_ISARCHIVE_2150L 0x08 /* Archive Viper 2150L. */
+#define MT_ISARCHIVE_2060L 0x09 /* Archive Viper 2060L. */
+#define MT_ISARCHIVESC499 0x0A /* Archive SC-499 QIC-36 controller. */
+#define MT_ISQIC02_ALL_FEATURES 0x0F /* Generic QIC-02 with all features. */
+#define MT_ISWT5099EEN24 0x11 /* Wangtek 5099-een24, 60MB, QIC-24. */
+#define MT_ISTEAC_MT2ST 0x12 /* Teac MT-2ST 155mb drive,
+ Teac DC-1 card (Wangtek type). */
+#define MT_ISEVEREX_FT40A 0x32 /* Everex FT40A (QIC-40). */
+#define MT_ISDDS1 0x51 /* DDS device without partitions. */
+#define MT_ISDDS2 0x52 /* DDS device with partitions. */
+#define MT_ISSCSI1 0x71 /* Generic ANSI SCSI-1 tape unit. */
+#define MT_ISSCSI2 0x72 /* Generic ANSI SCSI-2 tape unit. */
+
+/* QIC-40/80/3010/3020 ftape supported drives.
+ 20bit vendor ID + 0x800000 (see vendors.h in ftape distribution). */
+#define MT_ISFTAPE_UNKNOWN 0x800000 /* obsolete */
+#define MT_ISFTAPE_FLAG 0x800000
+
+struct mt_tape_info
+ {
+ long int t_type; /* Device type id (mt_type). */
+ char *t_name; /* Descriptive name. */
+ };
+
+#define MT_TAPE_INFO \
+ { \
+ {MT_ISUNKNOWN, "Unknown type of tape device"}, \
+ {MT_ISQIC02, "Generic QIC-02 tape streamer"}, \
+ {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \
+ {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, \
+ {MT_ISCMSJ500, "CMS Jumbo 500"}, \
+ {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"}, \
+ {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"}, \
+ {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, \
+ {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \
+ {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"}, \
+ {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"}, \
+ {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"}, \
+ {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"}, \
+ {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, \
+ {MT_ISSCSI1, "Generic SCSI-1 tape"}, \
+ {MT_ISSCSI2, "Generic SCSI-2 tape"}, \
+ {0, NULL} \
+ }
+
+
+/* Structure for MTIOCPOS - mag tape get position command. */
+
+struct mtpos
+ {
+ long int mt_blkno; /* Current block number. */
+ };
+
+
+/* Structure for MTIOCGETCONFIG/MTIOCSETCONFIG primarily intended
+ as an interim solution for QIC-02 until DDI is fully implemented. */
+struct mtconfiginfo
+ {
+ long int mt_type; /* Drive type. */
+ long int ifc_type; /* Interface card type. */
+ unsigned short int irqnr; /* IRQ number to use. */
+ unsigned short int dmanr; /* DMA channel to use. */
+ unsigned short int port; /* IO port base address. */
+
+ unsigned long int debug; /* Debugging flags. */
+
+ unsigned have_dens:1;
+ unsigned have_bsf:1;
+ unsigned have_fsr:1;
+ unsigned have_bsr:1;
+ unsigned have_eod:1;
+ unsigned have_seek:1;
+ unsigned have_tell:1;
+ unsigned have_ras1:1;
+ unsigned have_ras2:1;
+ unsigned have_ras3:1;
+ unsigned have_qfa:1;
+
+ unsigned pad1:5;
+ char reserved[10];
+ };
+
+
+/* Magnetic tape I/O control commands. */
+#define MTIOCTOP _IOW('m', 1, struct mtop) /* Do a mag tape op. */
+#define MTIOCGET _IOR('m', 2, struct mtget) /* Get tape status. */
+#define MTIOCPOS _IOR('m', 3, struct mtpos) /* Get tape position.*/
+
+/* The next two are used by the QIC-02 driver for runtime reconfiguration.
+ See tpqic02.h for struct mtconfiginfo. */
+#define MTIOCGETCONFIG _IOR('m', 4, struct mtconfiginfo) /* Get tape config.*/
+#define MTIOCSETCONFIG _IOW('m', 5, struct mtconfiginfo) /* Set tape config.*/
+
+/* Generic Mag Tape (device independent) status macros for examining
+ mt_gstat -- HP-UX compatible.
+ There is room for more generic status bits here, but I don't
+ know which of them are reserved. At least three or so should
+ be added to make this really useful. */
+#define GMT_EOF(x) ((x) & 0x80000000)
+#define GMT_BOT(x) ((x) & 0x40000000)
+#define GMT_EOT(x) ((x) & 0x20000000)
+#define GMT_SM(x) ((x) & 0x10000000) /* DDS setmark */
+#define GMT_EOD(x) ((x) & 0x08000000) /* DDS EOD */
+#define GMT_WR_PROT(x) ((x) & 0x04000000)
+/* #define GMT_ ? ((x) & 0x02000000) */
+#define GMT_ONLINE(x) ((x) & 0x01000000)
+#define GMT_D_6250(x) ((x) & 0x00800000)
+#define GMT_D_1600(x) ((x) & 0x00400000)
+#define GMT_D_800(x) ((x) & 0x00200000)
+/* #define GMT_ ? ((x) & 0x00100000) */
+/* #define GMT_ ? ((x) & 0x00080000) */
+#define GMT_DR_OPEN(x) ((x) & 0x00040000) /* Door open (no tape). */
+/* #define GMT_ ? ((x) & 0x00020000) */
+#define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* Immediate report mode.*/
+/* 16 generic status bits unused. */
+
+
+/* SCSI-tape specific definitions. Bitfield shifts in the status */
+#define MT_ST_BLKSIZE_SHIFT 0
+#define MT_ST_BLKSIZE_MASK 0xffffff
+#define MT_ST_DENSITY_SHIFT 24
+#define MT_ST_DENSITY_MASK 0xff000000
+
+#define MT_ST_SOFTERR_SHIFT 0
+#define MT_ST_SOFTERR_MASK 0xffff
+
+/* Bitfields for the MTSETDRVBUFFER ioctl. */
+#define MT_ST_OPTIONS 0xf0000000
+#define MT_ST_BOOLEANS 0x10000000
+#define MT_ST_SETBOOLEANS 0x30000000
+#define MT_ST_CLEARBOOLEANS 0x40000000
+#define MT_ST_WRITE_THRESHOLD 0x20000000
+#define MT_ST_DEF_BLKSIZE 0x50000000
+#define MT_ST_DEF_OPTIONS 0x60000000
+
+#define MT_ST_BUFFER_WRITES 0x1
+#define MT_ST_ASYNC_WRITES 0x2
+#define MT_ST_READ_AHEAD 0x4
+#define MT_ST_DEBUGGING 0x8
+#define MT_ST_TWO_FM 0x10
+#define MT_ST_FAST_MTEOM 0x20
+#define MT_ST_AUTO_LOCK 0x40
+#define MT_ST_DEF_WRITES 0x80
+#define MT_ST_CAN_BSR 0x100
+#define MT_ST_NO_BLKLIMS 0x200
+#define MT_ST_CAN_PARTITIONS 0x400
+#define MT_ST_SCSI2LOGICAL 0x800
+
+/* The mode parameters to be controlled. Parameter chosen with bits 20-28. */
+#define MT_ST_CLEAR_DEFAULT 0xfffff
+#define MT_ST_DEF_DENSITY (MT_ST_DEF_OPTIONS | 0x100000)
+#define MT_ST_DEF_COMPRESSION (MT_ST_DEF_OPTIONS | 0x200000)
+#define MT_ST_DEF_DRVBUFFER (MT_ST_DEF_OPTIONS | 0x300000)
+
+/* The offset for the arguments for the special HP changer load command. */
+#define MT_ST_HPLOADER_OFFSET 10000
+
/* Specify default tape device. */
#ifndef DEFTAPE
diff --git a/sysdeps/unix/sysv/linux/sys/procfs.h b/sysdeps/unix/sysv/linux/sys/procfs.h
index 59f0fcd594..e8d32390fa 100644
--- a/sysdeps/unix/sysv/linux/sys/procfs.h
+++ b/sysdeps/unix/sysv/linux/sys/procfs.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* 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
@@ -34,11 +34,11 @@
__BEGIN_DECLS
struct elf_siginfo
-{
- int si_signo; /* signal number */
- int si_code; /* extra code */
- int si_errno; /* errno */
-};
+ {
+ int si_signo; /* Signal number. */
+ int si_code; /* Extra code. */
+ int si_errno; /* Errno. */
+ };
typedef elf_greg_t greg_t;
typedef elf_gregset_t gregset_t;
@@ -53,52 +53,52 @@ typedef elf_fpregset_t fpregset_t;
gdb doesn't really use excluded. Fields present but not used are
marked with "XXX". */
struct elf_prstatus
-{
+ {
#if 0
- long pr_flags; /* XXX Process flags */
- short pr_why; /* XXX Reason for process halt */
- short pr_what; /* XXX More detailed reason */
+ long int pr_flags; /* XXX Process flags. */
+ short int pr_why; /* XXX Reason for process halt. */
+ short int pr_what; /* XXX More detailed reason. */
#endif
- struct elf_siginfo pr_info; /* Info associated with signal */
- short pr_cursig; /* Current signal */
- sigset_t pr_sigpend; /* Set of pending signals */
- sigset_t pr_sighold; /* Set of held signals */
+ struct elf_siginfo pr_info; /* Info associated with signal. */
+ short int pr_cursig; /* Current signal. */
+ unsigned long int pr_sigpend; /* Set of pending signals. */
+ unsigned long int pr_sighold; /* Set of held signals. */
#if 0
- struct sigaltstack pr_altstack; /* Alternate stack info */
- struct sigaction pr_action; /* Signal action for current sig */
+ struct sigaltstack pr_altstack; /* Alternate stack info. */
+ struct sigaction pr_action; /* Signal action for current sig. */
#endif
- pid_t pr_pid;
- pid_t pr_ppid;
- pid_t pr_pgrp;
- pid_t pr_sid;
- struct timeval pr_utime; /* User time */
- struct timeval pr_stime; /* System time */
- struct timeval pr_cutime; /* Cumulative user time */
- struct timeval pr_cstime; /* Cumulative system time */
+ __pid_t pr_pid;
+ __pid_t pr_ppid;
+ __pid_t pr_pgrp;
+ __pid_t pr_sid;
+ struct timeval pr_utime; /* User time. */
+ struct timeval pr_stime; /* System time. */
+ struct timeval pr_cutime; /* Cumulative user time. */
+ struct timeval pr_cstime; /* Cumulative system time. */
#if 0
- long pr_instr; /* Current instruction */
+ long int pr_instr; /* Current instruction. */
#endif
- elf_gregset_t pr_reg; /* GP registers */
- int pr_fpvalid; /* True if math copro being used. */
-};
+ elf_gregset_t pr_reg; /* GP registers. */
+ int pr_fpvalid; /* True if math copro being used. */
+ };
#define ELF_PRARGSZ (80) /* Number of chars for args */
struct elf_prpsinfo
-{
- char pr_state; /* numeric process state */
- char pr_sname; /* char for pr_state */
- char pr_zomb; /* zombie */
- char pr_nice; /* nice val */
- unsigned long pr_flag; /* flags */
- uid_t pr_uid;
- gid_t pr_gid;
- pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
- /* Lots missing */
- char pr_fname[16]; /* filename of executable */
- char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
-};
+ {
+ char pr_state; /* Numeric process state. */
+ char pr_sname; /* Char for pr_state. */
+ char pr_zomb; /* Zombie. */
+ char pr_nice; /* Nice val. */
+ unsigned long int pr_flag; /* Flags. */
+ unsigned short int pr_uid;
+ unsigned short int pr_gid;
+ unsigned short int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+ /* Lots missing */
+ char pr_fname[16]; /* Filename of executable. */
+ char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
+ };
typedef struct elf_prstatus prstatus_t;
diff --git a/sysdeps/unix/sysv/linux/sys/sysmacros.h b/sysdeps/unix/sysv/linux/sys/sysmacros.h
index b859dc7d64..85b1b85d2e 100644
--- a/sysdeps/unix/sysv/linux/sys/sysmacros.h
+++ b/sysdeps/unix/sysv/linux/sys/sysmacros.h
@@ -22,8 +22,8 @@
#define _SYS_SYSMACROS_H 1
/* For compatibility we provide alternative names. */
-#define major(dev) ((dev) >> 32)
-#define minor(dev) ((dev) & 0xffffffff)
-#define makedev(major, minor) (((major) << 32) | (monor))
+#define major(dev) (((dev) >> 8) & 0xff)
+#define minor(dev) ((dev) & 0xff)
+#define makedev(major, minor) (((major) << 8) | (minor))
#endif /* _SYS_SYSMACROS_H */
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index 5367a2826b..20ac94ae26 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -35,6 +35,7 @@ s_getdents EXTRA getdents 3 __getdents
s_getpriority getpriority getpriority 2 __syscall_getpriority
s_ptrace ptrace ptrace 4 __syscall_ptrace
s_reboot EXTRA reboot 3 __syscall_reboot
+s_sigaction sigaction sigaction 3 __syscall_sigaction
s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend
s_sysctl sysctl _sysctl 1 __syscall__sysctl
s_ustat ustat ustat 2 __syscall_ustat
diff --git a/time/Makefile b/time/Makefile
index 966d9f2790..af03fa2961 100644
--- a/time/Makefile
+++ b/time/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -12,9 +12,9 @@
# 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.
+# 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 time routines
@@ -36,15 +36,21 @@ routines := offtime asctime clock ctime ctime_r difftime \
others := ap zdump zic
tests := test_time clocktest test-tz
+# Before the test-tz test can be run we need the data to be installed.
+tests: install-test-data
+
+
tzfiles := africa antarctica asia australasia europe northamerica \
southamerica etcetera factory systemv backward \
solar87 solar88 solar89
# pacificnew doesn't compile; if it is to be used, it should be included in
# northamerica.
-distribute := $(distribute) $(tzfiles) leapseconds pacificnew
+distribute := $(distribute) $(tzfiles) leapseconds pacificnew simplebackw
install-sbin := zic zdump
+generated-dirs = testdata
+
all: # Make this the default target; it will be defined in Rules.
include ../Makeconfig # Get objpfx defined so we can use it below.
@@ -72,6 +78,11 @@ install-others = $(addprefix $(zonedir)/,$(zonenames) \
$(installed-localtime-file) $(installed-posixrules-file)
endif
+ifeq ($(have-ksh),yes)
+install-others += $(zonedir)/iso3166.tab $(zonedir)/zone.tab
+install-bin += tzselect
+endif
+
include ../Rules
@@ -146,3 +157,25 @@ CFLAGS-zic.c = -Wno-strict-prototypes -DNOID $(tz-cflags)
CFLAGS-ialloc.c = -Wno-strict-prototypes -DNOID
CFLAGS-scheck.c = -Wno-strict-prototypes -DNOID
CFLAGS-tzfile.c = $(tz-cflags)
+
+# We have to make sure the data for testing the tz functions is available.
+.PHONY: install-test-data
+install-test-data: northamerica $(objpfx)zic $(leapseconds) yearistype \
+ etcetera simplebackw
+ -mkdir $(objpfx)testdata
+ $(built-program-cmd) -d $(objpfx)testdata -L $(leapseconds) \
+ -y yearistype northamerica
+ $(built-program-cmd) -d $(objpfx)testdata -L $(leapseconds) \
+ -y yearistype etcetera
+ $(built-program-cmd) -d $(objpfx)testdata -L $(leapseconds) \
+ -y yearistype simplebackw
+test-tz-ENV = TZDIR=$(objpfx)testdata
+
+
+$(objpfx)tzselect: tzselect.ksh
+ sed -e 's%@KSH@%$(KSH)%g' \
+ -e 's%@TZDIR@%$(zonedir)%g' < $< > $@.new
+ chmod 555 $@.new
+ mv -f $@.new $@
+
+$(addprefix $(zonedir)/,iso3166.tab zone.tab): $(zonedir)/%: %; $(do-install)
diff --git a/time/mktime.c b/time/mktime.c
index 7fa5ccb23a..223872f228 100644
--- a/time/mktime.c
+++ b/time/mktime.c
@@ -1,22 +1,21 @@
-/* Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
Contributed by Paul Eggert (eggert@twinsun.com).
-This file is part of the GNU C Library.
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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 free software; you can redistribute it and/or
-modify it under the terms of the GNU 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.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY 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. */
+ 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 this to have a standalone program to test this implementation of
mktime. */
@@ -86,6 +85,9 @@ Cambridge, MA 02139, USA. */
((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
#endif
+/* Prototype for the internal function to get information based on TZ. */
+extern void __tzset_internal __P ((int always));
+
/* How many days come before each month (0-12). */
const unsigned short int __mon_yday[2][13] =
{
@@ -161,6 +163,11 @@ time_t
mktime (tp)
struct tm *tp;
{
+#ifdef _LIBC
+ /* Update internal database according to current TZ setting. */
+ __tzset_internal (1);
+#endif
+
return __mktime_internal (tp, localtime_r, &localtime_offset);
}
diff --git a/time/simplebackw b/time/simplebackw
new file mode 100644
index 0000000000..860624a1c3
--- /dev/null
+++ b/time/simplebackw
@@ -0,0 +1,2 @@
+Link Etc/UTC UTC
+Link Etc/Universal Universal
diff --git a/time/strptime.c b/time/strptime.c
index bd38f9681f..f220313475 100644
--- a/time/strptime.c
+++ b/time/strptime.c
@@ -1,5 +1,5 @@
-/* strptime - Convert a string representation of time to a time value.
- Copyright (C) 1996 Free Software Foundation, Inc.
+/* Convert a string representation of time to a time value.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -18,24 +18,71 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+/* XXX This version of the implementation is not really complete.
+ Some of the fields cannot add information alone. But if seeing
+ some of them in the same format (such as year, week and weekday)
+ this is enough information for determining the date. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
#include <ctype.h>
#include <langinfo.h>
#include <limits.h>
#include <string.h>
#include <time.h>
-#include "../locale/localeinfo.h"
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+
+#ifndef __P
+# if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
+# define __P(args) args
+# else
+# define __P(args) ()
+# endif /* GCC. */
+#endif /* Not __P. */
+
+#if ! HAVE_LOCALTIME_R && ! defined (localtime_r)
+#ifdef _LIBC
+#define localtime_r __localtime_r
+#else
+/* Approximate localtime_r as best we can in its absence. */
+#define localtime_r my_localtime_r
+static struct tm *localtime_r __P ((const time_t *, struct tm *));
+static struct tm *
+localtime_r (t, tp)
+ const time_t *t;
+ struct tm *tp;
+{
+ struct tm *l = localtime (t);
+ if (! l)
+ return 0;
+ *tp = *l;
+ return tp;
+}
+#endif /* ! _LIBC */
+#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
#define match_char(ch1, ch2) if (ch1 != ch2) return NULL
-#define match_string(cs1, s2) \
+#if defined __GNUC__ && __GNUC__ >= 2
+# define match_string(cs1, s2) \
({ size_t len = strlen (cs1); \
- int result = strncasecmp (cs1, s2, len) == 0; \
- if (result) s2 += len; \
+ int result = strncasecmp ((cs1), (s2), len) == 0; \
+ if (result) (s2) += len; \
result; })
+#else
+/* Oh come on. Get a reasonable compiler. */
+# define match_string(cs1, s2) \
+ (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1))
+#endif
/* We intentionally do not use isdigit() for testing because this will
lead to problems with the wide character version. */
-#define get_number(from, to) \
+#define get_number(from, to) \
do { \
val = 0; \
if (*rp < '0' || *rp > '9') \
@@ -47,33 +94,98 @@
if (val < from || val > to) \
return NULL; \
} while (0)
-#define get_alt_number(from, to) \
+#ifdef _NL_CURRENT
+# define get_alt_number(from, to) \
do { \
- const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \
- val = 0; \
- while (*alts != '\0') \
+ if (*decided != raw) \
{ \
- size_t len = strlen (alts); \
- if (strncasecmp (alts, rp, len) == 0) \
- break; \
- alts = strchr (alts, '\0') + 1; \
- ++val; \
+ const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \
+ val = 0; \
+ while (*alts != '\0') \
+ { \
+ size_t len = strlen (alts); \
+ if (strncasecmp (alts, rp, len) == 0) \
+ break; \
+ alts = strchr (alts, '\0') + 1; \
+ ++val; \
+ } \
+ if (*alts == '\0') \
+ { \
+ if (*decided == loc && val != 0) \
+ return NULL; \
+ } \
+ else \
+ { \
+ *decided = loc; \
+ break; \
+ } \
} \
- if (*alts == '\0') \
- return NULL; \
- } while (0)
-#define recursive(new_fmt) \
- do { \
- if (*new_fmt == '\0') \
- return NULL; \
- rp = strptime (rp, new_fmt, tm); \
- if (rp == NULL) \
- return NULL; \
+ get_number (from, to); \
} while (0)
+#else
+# define get_alt_number(from, to) \
+ /* We don't have the alternate representation. */ \
+ get_number(from, to)
+#endif
+#define recursive(new_fmt) \
+ (*(new_fmt) != '\0' \
+ || strptime_internal (rp, (new_fmt), tm, decided) != NULL)
-char *
-strptime (const char *buf, const char *format, struct tm *tm)
+#ifdef _LIBC
+/* This is defined in locale/C-time.c in the GNU libc. */
+extern const struct locale_data _nl_C_LC_TIME;
+
+# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string)
+# define ab_weekday_name \
+ (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string)
+# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string)
+# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)
+# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
+# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
+# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)
+# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string)
+# define HERE_T_FMT_AMPM \
+ (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string)
+# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string)
+#else
+static char const weekday_name[][10] =
+ {
+ "Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"
+ };
+static char const ab_weekday_name[][4] =
+ {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+ };
+static char const month_name[][10] =
+ {
+ "January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"
+ };
+static char const ab_month_name[][4] =
+ {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y"
+# define HERE_D_FMT "%m/%d/%y"
+# define HERE_AM_STR "AM"
+# define HERE_PM_STR "PM"
+# define HERE_T_FMT_AMPM "%I:%M:%S %p"
+# define HERE_T_FMT "%H:%M:%S"
+#endif
+
+/* Status of lookup: do we use the locale data or the raw data? */
+enum locale_status { not, loc, raw };
+
+
+static char *
+strptime_internal (buf, format, tm, decided)
+ const char *buf;
+ const char *format;
+ struct tm *tm;
+ enum locale_status *decided;
{
const char *rp;
const char *fmt;
@@ -106,6 +218,10 @@ strptime (const char *buf, const char *format, struct tm *tm)
}
++fmt;
+#ifndef _NL_CURRENT
+ /* We need this for handling the `E' modifier. */
+ start_over:
+#endif
switch (*fmt++)
{
case '%':
@@ -117,10 +233,34 @@ strptime (const char *buf, const char *format, struct tm *tm)
/* Match day of week. */
for (cnt = 0; cnt < 7; ++cnt)
{
- if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
- break;
- if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
- break;
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
+ ab_weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
+ weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (*decided != loc
+ && (match_string (ab_weekday_name[cnt], rp)
+ || match_string (weekday_name[cnt], rp)))
+ {
+ *decided = raw;
+ break;
+ }
}
if (cnt == 7)
/* Does not match a weekday name. */
@@ -133,10 +273,33 @@ strptime (const char *buf, const char *format, struct tm *tm)
/* Match month name. */
for (cnt = 0; cnt < 12; ++cnt)
{
- if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
- break;
- if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
- break;
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
+ ab_month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
+ month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (match_string (ab_month_name[cnt], rp)
+ || match_string (month_name[cnt], rp))
+ {
+ *decided = raw;
+ break;
+ }
}
if (cnt == 12)
/* Does not match a month name. */
@@ -145,7 +308,26 @@ strptime (const char *buf, const char *format, struct tm *tm)
break;
case 'c':
/* Match locale's date and time format. */
- recursive (_NL_CURRENT (LC_TIME, D_T_FMT));
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
break;
case 'C':
/* Match century number. */
@@ -158,9 +340,30 @@ strptime (const char *buf, const char *format, struct tm *tm)
get_number (1, 31);
tm->tm_mday = val;
break;
+ case 'x':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ }
+ else
+ {
+ if (decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
case 'D':
/* Match standard day format. */
- recursive ("%m/%d/%y");
+ if (!recursive (HERE_D_FMT))
+ return NULL;
break;
case 'H':
/* Match hour in 24-hour clock. */
@@ -197,19 +400,57 @@ strptime (const char *buf, const char *format, struct tm *tm)
break;
case 'p':
/* Match locale's equivalent of AM/PM. */
- if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
- break;
- if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
+#ifdef _NL_CURRENT
+ if (*decided != raw)
{
- is_pm = 1;
- break;
+ if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
+ *decided = loc;
+ is_pm = 1;
+ break;
+ }
+ *decided = raw;
}
- return NULL;
+#endif
+ if (!match_string (HERE_AM_STR, rp))
+ if (match_string (HERE_PM_STR, rp))
+ is_pm = 1;
+ else
+ return NULL;
+ break;
case 'r':
- recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM));
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
+ {
+ if (*decided == loc)
+ return NULL;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
+ HERE_T_FMT_AMPM))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_T_FMT_AMPM))
+ return NULL;
break;
case 'R':
- recursive ("%H:%M");
+ if (!recursive ("%H:%M"))
+ return NULL;
break;
case 's':
{
@@ -229,7 +470,7 @@ strptime (const char *buf, const char *format, struct tm *tm)
}
while (*rp >= '0' && *rp <= '9');
- if (__localtime_r (&secs, tm) == NULL)
+ if (localtime_r (&secs, tm) == NULL)
/* Error in function. */
return NULL;
}
@@ -238,8 +479,28 @@ strptime (const char *buf, const char *format, struct tm *tm)
get_number (0, 61);
tm->tm_sec = val;
break;
+ case 'X':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ }
+ else
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
case 'T':
- recursive ("%H:%M:%S");
+ if (!recursive (HERE_T_FMT))
+ return NULL;
break;
case 'u':
get_number (1, 7);
@@ -262,19 +523,14 @@ strptime (const char *buf, const char *format, struct tm *tm)
case 'V':
case 'W':
get_number (0, 53);
- /* XXX This cannot determine any field in TM. */
+ /* XXX This cannot determine any field in TM without some
+ information. */
break;
case 'w':
/* Match number of weekday. */
get_number (0, 6);
tm->tm_wday = val;
break;
- case 'x':
- recursive (_NL_CURRENT (LC_TIME, D_FMT));
- break;
- case 'X':
- recursive (_NL_CURRENT (LC_TIME, T_FMT));
- break;
case 'y':
/* Match year within century. */
get_number (0, 99);
@@ -289,11 +545,35 @@ strptime (const char *buf, const char *format, struct tm *tm)
/* XXX How to handle this? */
break;
case 'E':
+#ifdef _NL_CURRENT
switch (*fmt++)
{
case 'c':
/* Match locale's alternate date and time format. */
- recursive (_NL_CURRENT (LC_TIME, ERA_D_T_FMT));
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ /* The C locale has no era information, so use the
+ normal representation. */
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
break;
case 'C':
case 'y':
@@ -301,20 +581,70 @@ strptime (const char *buf, const char *format, struct tm *tm)
/* Match name of base year in locale's alternate
representation. */
/* XXX This is currently not implemented. It should
- use the value _NL_CURRENT (LC_TIME, ERA) but POSIX
- leaves this implementation defined and we haven't
- figured out how to do it yet. */
+ use the value _NL_CURRENT (LC_TIME, ERA). */
break;
case 'x':
- recursive (_NL_CURRENT (LC_TIME, ERA_D_FMT));
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_D_FMT))
+ return NULL;
break;
case 'X':
- recursive (_NL_CURRENT (LC_TIME, ERA_T_FMT));
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_T_FMT))
+ return NULL;
break;
default:
return NULL;
}
break;
+#else
+ /* We have no information about the era format. Just use
+ the normal format. */
+ if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
+ && *fmt != 'x' && *fmt != 'X')
+ /* This is an illegal format. */
+ return NULL;
+
+ goto start_over;
+#endif
case 'O':
switch (*fmt++)
{
@@ -357,7 +687,8 @@ strptime (const char *buf, const char *format, struct tm *tm)
case 'V':
case 'W':
get_alt_number (0, 53);
- /* XXX This cannot determine any field in TM. */
+ /* XXX This cannot determine any field in TM without
+ further information. */
break;
case 'w':
/* Match number of weekday using alternate numeric symbols. */
@@ -382,3 +713,19 @@ strptime (const char *buf, const char *format, struct tm *tm)
return (char *) rp;
}
+
+
+char *
+strptime (buf, format, tm)
+ const char *buf;
+ const char *format;
+ struct tm *tm;
+{
+ enum locale_status decided;
+#ifdef _NL_CURRENT
+ decided = not;
+#else
+ decided = raw;
+#endif
+ return strptime_internal (buf, format, tm, &decided);
+}
diff --git a/time/test-tz.c b/time/test-tz.c
index 2e1432cf11..528aa6f7ab 100644
--- a/time/test-tz.c
+++ b/time/test-tz.c
@@ -17,7 +17,7 @@ struct {
int
-main(int argc, char ** argv)
+main (int argc, char ** argv)
{
int errors = 0;
struct tm tm;
@@ -36,8 +36,7 @@ main(int argc, char ** argv)
for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
{
putenv (tests[i].env);
- tzset ();
- t = mktime(&tm);
+ t = mktime (&tm);
if (t != tests[i].expected)
{
printf ("%s: flunked test %u (expected %lu, got %lu)\n",
diff --git a/time/tzfile.c b/time/tzfile.c
index d80789d570..761ddc9539 100644
--- a/time/tzfile.c
+++ b/time/tzfile.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 95, 96 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 95, 96, 97 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -113,16 +113,28 @@ __tzfile_read (const char *file)
if (*file != '/')
{
- static const char tzdir[] = TZDIR;
- register const unsigned int len = strlen (file) + 1;
- char *new = (char *) __alloca (sizeof (tzdir) + len);
- memcpy (new, tzdir, sizeof(tzdir) - 1);
- new[sizeof (tzdir) - 1] = '/';
- memcpy (&new[sizeof (tzdir)], file, len);
+ static const char default_tzdir[] = TZDIR;
+ const char *tzdir;
+ unsigned int len, tzdir_len;
+ char *new;
+
+ tzdir = __secure_getenv ("TZDIR");
+ if (tzdir == NULL || *tzdir == '\0')
+ {
+ tzdir = default_tzdir;
+ tzdir_len = sizeof (default_tzdir) - 1;
+ }
+ else
+ tzdir_len = strlen (tzdir);
+ len = strlen (file) + 1;
+ new = (char *) __alloca (tzdir_len + 1 + len);
+ memcpy (new, tzdir, tzdir_len);
+ new[tzdir_len] = '/';
+ memcpy (&new[tzdir_len + 1], file, len);
file = new;
}
- f = fopen(file, "r");
+ f = fopen (file, "r");
if (f == NULL)
return;
@@ -171,6 +183,12 @@ __tzfile_read (const char *file)
fread(type_idxs, 1, num_transitions, f) != num_transitions)
goto lose;
+ /* Check for bogus indices in the data file, so we can hereafter
+ safely use type_idxs[T] as indices into `types' and never crash. */
+ for (i = 0; i < num_transitions; ++i)
+ if (type_idxs[i] >= num_types)
+ goto lose;
+
if (BYTE_ORDER != BIG_ENDIAN || sizeof (time_t) != 4)
{
/* Decode the transition times, stored as 4-byte integers in
@@ -189,6 +207,8 @@ __tzfile_read (const char *file)
fread (&types[i].isdst, 1, 1, f) != 1 ||
fread (&types[i].idx, 1, 1, f) != 1)
goto lose;
+ if (types[i].idx >= chars) /* Bogus index in data file. */
+ goto lose;
types[i].offset = (long int) decode (x);
}
@@ -335,6 +355,10 @@ __tzfile_default (char *std, char *dst, long int stdoff, long int dstoff)
types[1].offset = dstoff;
types[1].isdst = 1;
+ /* Reset the zone names to point to the user's names. */
+ __tzname[0] = &zone_names[0];
+ __tzname[1] = &zone_names[stdlen];
+
compute_tzname_max (stdlen + dstlen);
}
@@ -425,7 +449,7 @@ compute_tzname_max (size_t chars)
const char *start = p;
while (*p != '\0')
++p;
- if (p - start > __tzname_cur_max)
+ if ((size_t) (p - start) > __tzname_cur_max)
__tzname_cur_max = p - start;
} while (++p < &zone_names[chars]);
}
diff --git a/time/tzselect.ksh b/time/tzselect.ksh
index 0f0a3bb28e..33bdbc7431 100644
--- a/time/tzselect.ksh
+++ b/time/tzselect.ksh
@@ -1,4 +1,4 @@
-#! /bin/ksh
+#! @KSH@
# Ask the user about the time zone, and output the resulting TZ value to stdout.
# Interact with the user via stderr and stdin.
@@ -11,7 +11,7 @@
# you can use either of the following free programs instead:
#
# Bourne-Again shell (bash)
-# <URL:ftp://prep.ai.mit.edu:/pub/gnu/bash-1.14.7.tar.gz>
+# <URL:ftp://prep.ai.mit.edu:/pub/gnu/bash-2.0.tar.gz>
# (or any later version)
#
# Public domain ksh
@@ -22,7 +22,7 @@
# you can use either of the following free programs instead:
#
# GNU awk (gawk)
-# <URL:ftp://prep.ai.mit.edu:/pub/gnu/gawk-3.0.0.tar.gz>
+# <URL:ftp://prep.ai.mit.edu:/pub/gnu/gawk-3.0.2.tar.gz>
# (or any later version)
#
# mawk
@@ -32,7 +32,7 @@
# Specify default values for environment variables if they are unset.
: ${AWK=awk}
-: ${TZDIR=$(pwd)}
+: ${TZDIR=@TZDIR@}
# Check for awk Posix compliance.
($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
diff --git a/time/tzset.c b/time/tzset.c
index 13360b445b..8d8be34405 100644
--- a/time/tzset.c
+++ b/time/tzset.c
@@ -108,16 +108,12 @@ __tzset_internal (always)
/* Free old storage. */
if (tz_rules[0].name != NULL && *tz_rules[0].name != '\0')
- {
- free((void *) tz_rules[0].name);
- tz_rules[0].name = NULL;
- }
+ free((void *) tz_rules[0].name);
if (tz_rules[1].name != NULL && *tz_rules[1].name != '\0' &&
tz_rules[1].name != tz_rules[0].name)
- {
- free((void *) tz_rules[1].name);
- tz_rules[1].name = NULL;
- }
+ free((void *) tz_rules[1].name);
+ tz_rules[0].name = NULL;
+ tz_rules[1].name = NULL;
/* Save the value of `tz'. */
if (old_tz != NULL)
@@ -234,6 +230,9 @@ __tzset_internal (always)
tz += l;
}
}
+ else
+ /* There is no DST. */
+ tz_rules[1].name = tz_rules[0].name;
/* Figure out the DST offset from GMT. */
if (*tz == '-' || *tz == '+')
diff --git a/values.h b/values.h
index 0b2b661abd..3c82842870 100644
--- a/values.h
+++ b/values.h
@@ -1,5 +1,5 @@
/* Old compatibility names for <limits.h> and <float.h> constants.
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 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
@@ -21,7 +21,9 @@
<limits.h> and/or <float.h> instead of <values.h>. */
#ifndef _VALUES_H
+
#define _VALUES_H 1
+#include <features.h>
#include <limits.h>
@@ -30,7 +32,7 @@
#define CHARBITS _TYPEBITS (char)
#define SHORTBITS _TYPEBITS (short int)
#define INTBITS _TYPEBITS (int)
-#define LONGBITS _TYPEBITS (long)
+#define LONGBITS _TYPEBITS (long int)
#define PTRBITS _TYPEBITS (char *)
#define DOUBLEBITS _TYPEBITS (double)
#define FLOATBITS _TYPEBITS (float)
@@ -59,4 +61,9 @@
#define FMAXEXP FLT_MAX_EXP
+#ifdef __USE_MISC
+/* Some systems define this name instead of CHAR_BIT or CHARBITS. */
+#define BITSPERBYTE CHAR_BIT
+#endif
+
#endif /* values.h */