update from main archive 970118 libc-970119
authordrepper <drepper>
Sun, 19 Jan 1997 04:52:22 +0000 (04:52 +0000)
committerdrepper <drepper>
Sun, 19 Jan 1997 04:52:22 +0000 (04:52 +0000)
69 files changed:
FAQ
Makeconfig
Makefile
Makerules
config.make.in
configure
configure.in
elf/Makefile
glibcbug.in
inet/arpa/inet.h
inet/netinet/ip.h
libc-symbols.h
locale/C-time.c
locale/localeinfo.h
locale/programs/ld-time.c
locale/programs/linereader.c
malloc/malloc.c
misc/syslog.c
posix/getopt.c
resolv/nss_dns/dns-host.c
stdio-common/Makefile
stdio-common/bug10.c
stdio-common/scanf1.c
stdio-common/scanf10.c
stdio-common/scanf11.c [new file with mode: 0644]
stdio-common/scanf3.c
stdio-common/tstdiomisc.c
stdio-common/vfscanf.c
stdlib/strtol.c
stdlib/tst-strtol.c
sysdeps/generic/sysd-stdio.c
sysdeps/libm-i387/e_exp.S
sysdeps/libm-i387/e_expf.S
sysdeps/libm-i387/e_expl.S
sysdeps/libm-i387/s_expm1.S
sysdeps/libm-i387/s_expm1f.S
sysdeps/libm-i387/s_expm1l.S
sysdeps/mach/hurd/posix_opt.h
sysdeps/mach/hurd/vdprintf.c
sysdeps/mach/libc-lock.h
sysdeps/posix/vdprintf.c
sysdeps/stub/vdprintf.c
sysdeps/unix/Makefile
sysdeps/unix/bsd/bsd4.4/direntry.h
sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/alpha/sys/procfs.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/getgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/setgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/syscalls.list
sysdeps/unix/sysv/linux/kernel_sigaction.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/m68k/getgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/m68k/setgroups.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/m68k/syscalls.list
sysdeps/unix/sysv/linux/sigaction.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sys/ipc_buf.h
sysdeps/unix/sysv/linux/sys/mtio.h
sysdeps/unix/sysv/linux/sys/procfs.h
sysdeps/unix/sysv/linux/sys/sysmacros.h
sysdeps/unix/sysv/linux/syscalls.list
time/Makefile
time/mktime.c
time/simplebackw [new file with mode: 0644]
time/strptime.c
time/test-tz.c
time/tzfile.c
time/tzselect.ksh
time/tzset.c
values.h

diff --git a/FAQ b/FAQ
index e5b18bf..642dfee 100644 (file)
--- 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>
 \f
 Local Variables:
  mode:text
index 4f65e6d..e3f7b52 100644 (file)
@@ -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) \
index 00be7a8..6420be8 100644 (file)
--- 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
 \f
 # 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)
 \f
 # This makes the Info or DVI file of the documentation from the Texinfo source.
 .PHONY: info dvi
index abff545..88d55a6 100644 (file)
--- 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)
 \f
index 8211b64..a4a6676 100644 (file)
@@ -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.
index cf93d8a..b1772ec 100755 (executable)
--- 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
index 4716052..7280c7a 100644 (file)
@@ -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
index 4cb8d7e..8f98cb8 100644 (file)
@@ -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' \
index c23f32a..6473b2c 100644 (file)
@@ -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
index 5619943..03021e6 100644 (file)
@@ -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 *));
index 6624ac4..6533885 100644 (file)
@@ -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)
index 370c631..b583f33 100644 (file)
@@ -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
index dbb51f3..67254b2 100644 (file)
@@ -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"
 
index 335e866..018220f 100644 (file)
@@ -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
index abd21db..cc571b8 100644 (file)
@@ -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 = "";
            }
index 4759615..edb5a51 100644 (file)
@@ -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;
index 7e71e97..50bba6b 100644 (file)
@@ -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();
index 6e9cdef..5521ceb 100644 (file)
@@ -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
index 1cefc10..1c79eaa 100644 (file)
@@ -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] == ':' ? ':' : '?';
index 8d9d517..374da83 100644 (file)
 #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;
index f4e49e6..e7c1cb8 100644 (file)
@@ -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
index 5306471..5e8ae25 100644 (file)
@@ -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;
index 3adf532..58c78c2 100644 (file)
@@ -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;
 }
index f896137..27a5e66 100644 (file)
@@ -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 (file)
index 0000000..50ef26a
--- /dev/null
@@ -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;
+}
index 33495cc..5bfa80b 100644 (file)
@@ -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;
index 8dac4f2..dbce623 100644 (file)
@@ -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);
index cb6d396..ef0dbee 100644 (file)
@@ -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.  */
index 5a097b4..396e2ec 100644 (file)
@@ -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)
index 58878f2..1d398b4 100644 (file)
@@ -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
   };
index d28dde8..363a763 100644 (file)
@@ -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;
index 3c9d45b..e76b9c6 100644 (file)
@@ -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
index cd8dc7f..9a669cf 100644 (file)
@@ -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
index e398a90..e83d306 100644 (file)
@@ -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
index 2685d6e..78e8013 100644 (file)
@@ -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.
index 85c3c84..00f1562 100644 (file)
@@ -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.
index 45aa753..b7e6b36 100644 (file)
@@ -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.
index 75a07e1..045b4b6 100644 (file)
@@ -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
index 002f8c6..a69607e 100644 (file)
@@ -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;
+}
index 53dc8ee..05eb70c 100644 (file)
@@ -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 */
index 5147bb8..1cb0572 100644 (file)
@@ -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;
+}
index 729f012..f7ae121 100644 (file)
@@ -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)
index 15993b3..1aea477 100644 (file)
@@ -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 $@
 
index c221d55..b9e0d72 100644 (file)
@@ -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 (file)
index 0000000..900bff4
--- /dev/null
@@ -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 (file)
index 0000000..57830da
--- /dev/null
@@ -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 (file)
index 0000000..03af029
--- /dev/null
@@ -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 (file)
index 0000000..2b8f957
--- /dev/null
@@ -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 (file)
index 0000000..8f87119
--- /dev/null
@@ -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);
+}
index d95a120..392a257 100644 (file)
@@ -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 (file)
index 0000000..a058642
--- /dev/null
@@ -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 (file)
index 0000000..102ea24
--- /dev/null
@@ -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 (file)
index 0000000..0e70862
--- /dev/null
@@ -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>
index 7883d70..9a3e4d0 100644 (file)
@@ -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 (file)
index 0000000..a7b3e07
--- /dev/null
@@ -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)
index a1eba68..f5fea0d 100644 (file)
@@ -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.
 
 #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,
index 45db6a5..e238ef9 100644 (file)
@@ -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
    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
index 59f0fcd..e8d3239 100644 (file)
@@ -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
 __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;
index b859dc7..85b1b85 100644 (file)
@@ -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 */
index 5367a28..20ac94a 100644 (file)
@@ -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
index 966d9f2..af03fa2 100644 (file)
@@ -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)
index 7fa5ccb..223872f 100644 (file)
@@ -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 (file)
index 0000000..860624a
--- /dev/null
@@ -0,0 +1,2 @@
+Link   Etc/UTC                 UTC
+Link   Etc/Universal           Universal
index bd38f96..f220313 100644 (file)
@@ -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.
 
    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')                                                      \
     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);
+}
index 2e1432c..528aa6f 100644 (file)
@@ -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",
index d80789d..761ddc9 100644 (file)
@@ -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);
 }
 \f
@@ -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]);
 }
index 0f0a3bb..33bdbc7 100644 (file)
@@ -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
index 13360b4..8d8be34 100644 (file)
@@ -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 == '+')
index 0b2b661..3c82842 100644 (file)
--- 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 */