about summary refs log tree commit diff
path: root/libio
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-11-18 02:50:07 +0000
committerUlrich Drepper <drepper@redhat.com>1997-11-18 02:50:07 +0000
commit6973fc01278d6c8a5f309738d641a68228efe5ed (patch)
tree8a55528a374d3d945d203cd92570bcb06978e09f /libio
parentfe0ec73edb48eff3785f29ddbac75cae5f8b361b (diff)
downloadglibc-6973fc01278d6c8a5f309738d641a68228efe5ed.tar.gz
glibc-6973fc01278d6c8a5f309738d641a68228efe5ed.tar.xz
glibc-6973fc01278d6c8a5f309738d641a68228efe5ed.zip
1997-11-18 02:31  Ulrich Drepper  <drepper@cygnus.com>

	* iconv/Makefile: New file.
	* iconv/gconv.c: New file.
	* iconv/gconv.h: New file.
	* iconv/gconv_builtin.c: New file.
	* iconv/gconv_builtin.h: New file.
	* iconv/gconv_close.c: New file.
	* iconv/gconv_conf.c: New file.
	* iconv/gconv_db.c: New file.
	* iconv/gconv_dl.c: New file.
	* iconv/gconv_open.c: New file.
	* iconv/gconv_simple.c: New file.
	* iconv/iconv.c: New file.
	* iconv/iconv.h: New file.
	* iconv/iconv_close.c: New file.
	* iconv/iconv_open.c: New file.
	* include/gconv.h: New file.

	* Makeconfig: Define gconvdir.
	* Makefile (subdirs): Add iconv.

	* string/bits/string2.h: Add optimization for strtok_r.

	* sysdeps/generic/_G_config.h: Define __need_NULL to get definition
	for NULL.
	Reported by H.J. Lu <hjl@gnu.ai.mit.edu>.
	* configure.in: Correct test for bash2.
	* locale/Makefile (CFLAGS-charmap.c): Add -Wno-char-subscripts.
	(CFLAGS-locfile.c): Likewise.
	Suggested by Zack Weinberg <zack@rabi.phys.columbia.edu>.
	* misc/hsearch_r.c (hsearch_r): Avoid undefinitely search for
	non-existing entry if the table is full.
	* posix/regex.h: Pretty print.
	* stdio-common/printf_fp.c: Don't define NDEBUG if already defined.
	* sysdeps/posix/ctermid.c: Simplify a bit.
	* sysdeps/unix/sysv/linux/net/if.h: Pretty print.
1997-11-17  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/unix/sysv/linux/sys/quota.h: Add include for
	<sys/types.h> instead of <asm/types.h>.
1997-11-16  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* math/libm-test.c (asin_test): Add epsilon for asin (0.5).
1997-11-16 17:09  H.J. Lu  <hjl@gnu.ai.mit.edu>
	* libc.map (_IO_stdin_, _IO_stdout_, _IO_stderr_, _IO_fopen,
	fopen, freopen, _IO_fclose, fclose): Added to GLIBC_2.0.
	(_IO_stdin_, _IO_stdout_, _IO_stderr_): Removed from GLIBC_2.1.
	(_IO_2_1_stdin_, _IO_2_1_stdout_, _IO_2_1_stderr_, _IO_fclose,
	fclose): Added to GLIBC_2.1.
	* libio/Makefile (routines, shared-only-routines): Add
	oldiofclose.  Remove oldfreopen.
	* libio/freopen.c (freopen): When PIC is defined, call
	_IO_old_freopen () for old stdio.
	* libio/iofclose.c (_IO_new_fclose): Renamed from _IO_fclose.
	(_IO_fclose, fclose): Use _IO_new_fclose as default version
	for GLIBC_2.1.
	* libio/iolibio.h (_IO_old_freopen): Use _IO_old_file_close_it
	instead of _IO_file_close_it.
	* libio/libio.h (_IO_stdin_, _IO_stdout_, _IO_stderr_): Changed
	to _IO_2_1_stdxxx_.
	(_IO_stdin, _IO_stdout, _IO_stderr): Declare as extern if _LIBC
	* libio/libioP.h (_IO_old_do_flush): New.
	* libio/oldfileops.c (_IO_old_file_close_it,
	_IO_old_file_finish, _IO_old_file_overflow, _IO_old_file_sync):
	Call _IO_old_do_flush () instead of _IO_do_flush ().
	(_IO_old_file_xsputn): Call _IO_old_do_write () instead of
	_IO_do_write ().
	* libio/oldiofopen.c (_IO_old_fopen): Call _IO_old_file_init ()
	instead of _IO_file_init ().
	Bind old symbols to version GLIBC_2.0.
	* libio/oldstdfiles.c (DEF_STDFILE): Don't use symbol_version.
	(_IO_old_stdin_, _IO_old_stdout_, _IO_old_stderr_): Changed to
	_IO_stdxxx_.
	(_IO_check_libio): New function in .init.
	* libio/oldiofclose.c: New file.
	* libio/stdfiles.c (_IO_new_stdin_, _IO_new_stdout_,
	_IO_new_stderr_): Changed to _IO_2_1_stdxxx_.
	(DEF_STDFILE): Don't use default_symbol_version.
	* libio/stdio.c (stdin, stdout, stderr): Set to
	_IO_2_1_stdxxx_._
	(_IO_stdin, _IO_stdout, _IO_stderr): New, strong alias of
	stdxxx.
	* csu/Makefile (distribute): Add init.c.
	(extra-objs): Add init.o for ELF.
	(start-installed-name): Add $(objpfx)init.o.
	* csu/init.c: New file.
1997-11-12 08:02  H.J. Lu  <hjl@gnu.ai.mit.edu>
	* elf/dl-lookup.c (do_lookup): Don't use the hidden base
	definition as the default.
1997-08-27  Klaus Espenlaub  <kespenla@hydra.informatik.uni-ulm.de>
	* erand48_r.c (__erand48_r): Implement for 32 bit short int.
1997-11-15  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* elf/genrtldtbl.awk: Replace gensub for compatibility with gawk2
	(PR 351).
1997-11-16 21:01  Philip Blundell  <Philip.Blundell@pobox.com>
	* sysdeps/arm/sysdep.h: Use __APCS_32__ to decide whether or not
	to preserve condition codes on function call.
1997-11-13  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/generic/s_exp2l.c: Change exp2l to __ieee754_exp2l.
1997-11-14  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* math/libm-test.c (asin_test): Add epsilon for float.
	(tan_test): Add epsilon for float.
	(log1p_test): Add epsilon for float.
	(inverse_functions): Add epsilons.
	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers) [socket]: Add
	net/if_packet.h.
	* sysdeps/unix/sysv/linux/Dist: Add net/if_packet.h.
1997-11-10  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* md5-crypt/Makefile (extra-objs): Make recursively expanded
	variable, since $(object-suffixes) is not defined yet.
1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* db2/Makefile (distribute): db185/db185_int.src ->
	db185/db185_int.h.
1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* misc/tst-fdset.c: Don't require the value of FD_ISSET to be
	exactly one.
1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* sysdeps/generic/e_acoshl.c: Fix stub_warning: use the user level
	* sysdeps/generic/e_acosl.c: Likewise.
	* sysdeps/generic/e_asinl.c: Likewise.
	* sysdeps/generic/e_atan2l.c: Likewise.
	* sysdeps/generic/e_expl.c: Likewise.
	* sysdeps/generic/e_fmodl.c: Likewise.
	* sysdeps/generic/e_j0l.c: Likewise.
	* sysdeps/generic/e_j1l.c: Likewise.
	* sysdeps/generic/e_jnl.c: Likewise.
	* sysdeps/generic/e_lgammal_r.c: Likewise.
	* sysdeps/generic/e_log10l.c: Likewise.
	* sysdeps/generic/e_logl.c: Likewise.
	* sysdeps/generic/e_powl.c: Likewise.
	* sysdeps/generic/e_sqrtl.c: Likewise.
	* sysdeps/generic/e_exp2l.c: Likewise.

1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Make-dist (+sysdep-names): Remove extra paren.
	* Makefile (distribute): Add stub-tag.h.
	* elf/Makefile (distribute): Add atomicity.h.
	* stdlib/Makefile (headers): Add ucontext.h and sys/ucontext.h.
	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers)
	[$(subdir)=socket]: Add net/if_packet.h.
	* sysdeps/alpha/Dist: Remove setjmp_aux.c.
	* sysdeps/unix/sysv/linux/Dist: Add s_pread64.c, s_pwrite64.c,
	net/if_packet.h, scsi/sg.h.
1997-11-13  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* Makefile (install): Quote $(CC) expansion.
1997-11-14  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/unix/sysv/linux/getcwd.c (__getcwd): Added caching of
	working /proc cwd and no restrictions on path length.  Following
	some ideas from Andi Kleen <ak@muc.de> (PR 350).
1997-11-14 19:14  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
	* nis/nss_compat/compat-grp.c: Remove buggy assert call.
1997-11-14 22:23  Ulrich Drepper  <drepper@cygnus.com>
	* sysdeps/libm-i387/s_fdim.S: New file.
	* sysdeps/libm-i387/s_fdimf.S: New file.
	* sysdeps/libm-i387/s_fdiml.S: New file.
	* sysdeps/libm-i387/i686/s_fdim.S: New file.
	* sysdeps/libm-i387/i686/s_fdimf.S: New file.
	* sysdeps/libm-i387/i686/s_fdiml.S: New file.
1997-11-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* string/bits/string2.h (strstr): Avoid warning if HAYSTACK is a
	pointer to unsigned char.
1997-11-13  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/libm-ieee754/s_llrintf.c (__llrintf): Fix function.
	* sysdeps/libm-ieee754/s_lrintf.c (__lrintf): Fix function.
	* sysdeps/libm-ieee754/s_lrint.c (__lrint): Fix function.
1997-11-12  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/libm-ieee754/s_ilogbf.c: Correct return values for
	ilogb(0/NaN).
	* sysdeps/libm-ieee754/s_ilogbl.c: Likewise.
	* sysdeps/libm-ieee754/s_ilogb.c: Likewise.

1997-11-14 05:44  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-i387/s_fmin.S: New file.
	* sysdeps/libm-i387/s_fminf.S: New file.
	* sysdeps/libm-i387/s_fminl.S: New file.
	* sysdeps/libm-i387/s_fmax.S: New file.
	* sysdeps/libm-i387/s_fmaxf.S: New file.
	* sysdeps/libm-i387/s_fmaxl.S: New file.
	* sysdeps/libm-i387/i686/s_fmin.S: New file.
	* sysdeps/libm-i387/i686/s_fminf.S: New file.
	* sysdeps/libm-i387/i686/s_fminl.S: New file.
	* sysdeps/libm-i387/i686/s_fmax.S: New file.
	* sysdeps/libm-i387/i686/s_fmaxf.S: New file.
	* sysdeps/libm-i387/i686/s_fmaxl.S: New file.

1997-11-14 03:06  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/accept.S: Add __libc_accept as alias.
	* sysdeps/unix/sysv/linux/send.S: Likewise.
	* sysdeps/unix/sysv/linux/recv.S: Likewise.
	* sysdeps/unix/sysv/linux/connect.S: Likewise.
	Reported by Christopher Wiles <wileyc@ai.cs.fujitsu.co.jp>.
See ChangeLog.7 for earlier changes.
Diffstat (limited to 'libio')
-rw-r--r--libio/Makefile4
-rw-r--r--libio/freopen.c21
-rw-r--r--libio/iofclose.c13
-rw-r--r--libio/iolibio.h2
-rw-r--r--libio/libio.h16
-rw-r--r--libio/libioP.h3
-rw-r--r--libio/oldfileops.c14
-rw-r--r--libio/oldiofclose.c (renamed from libio/oldfreopen.c)40
-rw-r--r--libio/oldiofopen.c6
-rw-r--r--libio/oldstdfiles.c50
-rw-r--r--libio/stdfiles.c17
-rw-r--r--libio/stdio.c13
12 files changed, 137 insertions, 62 deletions
diff --git a/libio/Makefile b/libio/Makefile
index 033c959889..f3a66f32ca 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -43,7 +43,7 @@ all: # Make this the default target; it will be defined in Rules.
 include ../Makeconfig
 
 ifeq ($(versioning),yes)
-routines += oldiofopen oldfreopen
+routines += oldiofopen oldiofclose
 endif
 
 CPPFLAGS-.o += -DIO_DEBUG
@@ -62,7 +62,7 @@ ifeq ($(versioning),yes)
 aux	+= oldfileops oldstdfiles
 endif
 
-shared-only-routines = oldiofopen oldfreopen oldfileops oldstdfiles
+shared-only-routines = oldiofopen oldiofclose oldfileops oldstdfiles
 
 distribute := iolibio.h libioP.h strfile.h Banner
 
diff --git a/libio/freopen.c b/libio/freopen.c
index 7ab3e69845..808d8fab58 100644
--- a/libio/freopen.c
+++ b/libio/freopen.c
@@ -26,8 +26,13 @@
 #include "libioP.h"
 #include "stdio.h"
 
+#ifdef PIC
+extern void *_IO_stdin_used;
+weak_extern (_IO_stdin_used);
+#endif
+
 FILE*
-__new_freopen (filename, mode, fp)
+freopen (filename, mode, fp)
      const char* filename;
      const char* mode;
      FILE* fp;
@@ -38,9 +43,17 @@ __new_freopen (filename, mode, fp)
     return NULL;
   _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
   _IO_flockfile (fp);
-  result = _IO_freopen (filename, mode, fp);
+#ifdef PIC
+  if (&_IO_stdin_used == NULL)
+    /* If the shared C library is used by the application binary which
+       was linked against the older version of libio, we just use the
+       older one even for internal use to avoid trouble since a pointer
+       to the old libio may be passed into shared C library and wind
+       up here. */
+    result = _IO_old_freopen (filename, mode, fp);
+  else
+#endif
+    result = _IO_freopen (filename, mode, fp);
   _IO_cleanup_region_end (1);
   return result;
 }
-
-default_symbol_version (__new_freopen, freopen, GLIBC_2.1);
diff --git a/libio/iofclose.c b/libio/iofclose.c
index 35f4a8b569..35a23fa6ae 100644
--- a/libio/iofclose.c
+++ b/libio/iofclose.c
@@ -29,7 +29,7 @@
 #endif
 
 int
-_IO_fclose (fp)
+_IO_new_fclose (fp)
      _IO_FILE *fp;
 {
   int status;
@@ -53,6 +53,13 @@ _IO_fclose (fp)
   return status;
 }
 
-#ifdef weak_alias
-weak_alias (_IO_fclose, fclose)
+#ifdef DO_VERSIONING
+strong_alias (_IO_new_fclose, __new_fclose)
+default_symbol_version (_IO_new_fclose, _IO_fclose, GLIBC_2.1);
+default_symbol_version (__new_fclose, fclose, GLIBC_2.1);
+#else
+# ifdef weak_alias
+weak_alias (_IO_new_fclose, _IO_fclose)
+weak_alias (_IO_new_fclose, fclose)
+# endif
 #endif
diff --git a/libio/iolibio.h b/libio/iolibio.h
index bb5506444f..c1a9184305 100644
--- a/libio/iolibio.h
+++ b/libio/iolibio.h
@@ -53,7 +53,7 @@ extern int _IO_obstack_printf __P ((struct obstack *, const char *, ...));
 #define _IO_freopen(FILENAME, MODE, FP) \
   (_IO_file_close_it(FP), _IO_file_fopen(FP, FILENAME, MODE, 0))
 #define _IO_old_freopen(FILENAME, MODE, FP) \
-  (_IO_file_close_it(FP), _IO_old_file_fopen(FP, FILENAME, MODE))
+  (_IO_old_file_close_it (FP), _IO_old_file_fopen(FP, FILENAME, MODE))
 #define _IO_freopen64(FILENAME, MODE, FP) \
   (_IO_file_close_it(FP), _IO_file_fopen(FP, FILENAME, MODE, 1))
 #define _IO_fileno(FP) ((FP)->_fileno)
diff --git a/libio/libio.h b/libio/libio.h
index 7c91f6f6de..0c12ff0dc6 100644
--- a/libio/libio.h
+++ b/libio/libio.h
@@ -225,10 +225,18 @@ typedef struct _IO_FILE _IO_FILE;
 #endif
 
 struct _IO_FILE_complete;
-extern struct _IO_FILE_complete _IO_stdin_, _IO_stdout_, _IO_stderr_;
-#define _IO_stdin ((_IO_FILE*)(&_IO_stdin_))
-#define _IO_stdout ((_IO_FILE*)(&_IO_stdout_))
-#define _IO_stderr ((_IO_FILE*)(&_IO_stderr_))
+extern struct _IO_FILE_complete _IO_2_1_stdin_;
+extern struct _IO_FILE_complete _IO_2_1_stdout_;
+extern struct _IO_FILE_complete _IO_2_1_stderr_;
+#ifndef _LIBC
+#define _IO_stdin ((_IO_FILE*)(&_IO_2_1_stdin_))
+#define _IO_stdout ((_IO_FILE*)(&_IO_2_1_stdout_))
+#define _IO_stderr ((_IO_FILE*)(&_IO_2_1_stderr_))
+#else
+extern _IO_FILE *_IO_stdin;
+extern _IO_FILE *_IO_stdout;
+extern _IO_FILE *_IO_stderr;
+#endif
 
 
 /* Define the user-visible type, with user-friendly member names.  */
diff --git a/libio/libioP.h b/libio/libioP.h
index a90a604e53..a69d75b485 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -346,6 +346,9 @@ extern void _IO_flush_all_linebuffered __P ((void));
 #define _IO_do_flush(_f) \
   _IO_do_write(_f, (_f)->_IO_write_base, \
 	       (_f)->_IO_write_ptr-(_f)->_IO_write_base)
+#define _IO_old_do_flush(_f) \
+  _IO_old_do_write(_f, (_f)->_IO_write_base, \
+		   (_f)->_IO_write_ptr-(_f)->_IO_write_base)
 #define _IO_in_put_mode(_fp) ((_fp)->_flags & _IO_CURRENTLY_PUTTING)
 #define _IO_mask_flags(fp, f, mask) \
        ((fp)->_flags = ((fp)->_flags & ~(mask)) | ((f) & (mask)))
diff --git a/libio/oldfileops.c b/libio/oldfileops.c
index b426e88364..eec9eed670 100644
--- a/libio/oldfileops.c
+++ b/libio/oldfileops.c
@@ -130,7 +130,7 @@ _IO_old_file_close_it (fp)
   if (!_IO_file_is_open (fp))
     return EOF;
 
-  write_status = _IO_do_flush (fp);
+  write_status = _IO_old_do_flush (fp);
 
   _IO_unsave_markers(fp);
 
@@ -156,7 +156,7 @@ _IO_old_file_finish (fp, dummy)
 {
   if (_IO_file_is_open (fp))
     {
-      _IO_do_flush (fp);
+      _IO_old_do_flush (fp);
       if (!(fp->_flags & _IO_DELETE_DONT_CLOSE))
 	_IO_SYSCLOSE (fp);
     }
@@ -378,14 +378,14 @@ _IO_old_file_overflow (f, ch)
       f->_flags |= _IO_CURRENTLY_PUTTING;
     }
   if (ch == EOF)
-    return _IO_do_flush (f);
+    return _IO_old_do_flush (f);
   if (f->_IO_write_ptr == f->_IO_buf_end ) /* Buffer is really full */
-    if (_IO_do_flush (f) == EOF)
+    if (_IO_old_do_flush (f) == EOF)
       return EOF;
   *f->_IO_write_ptr++ = ch;
   if ((f->_flags & _IO_UNBUFFERED)
       || ((f->_flags & _IO_LINE_BUF) && ch == '\n'))
-    if (_IO_do_flush (f) == EOF)
+    if (_IO_old_do_flush (f) == EOF)
       return EOF;
   return (unsigned char) ch;
 }
@@ -401,7 +401,7 @@ _IO_old_file_sync (fp)
   _IO_flockfile (fp);
   /*    char* ptr = cur_ptr(); */
   if (fp->_IO_write_ptr > fp->_IO_write_base)
-    if (_IO_do_flush(fp)) return EOF;
+    if (_IO_old_do_flush(fp)) return EOF;
   delta = fp->_IO_read_ptr - fp->_IO_read_end;
   if (delta != 0)
     {
@@ -679,7 +679,7 @@ _IO_old_file_xsputn (f, data, n)
       dont_write = block_size >= 128 ? to_do % block_size : 0;
 
       count = to_do - dont_write;
-      if (_IO_do_write (f, s, count) == EOF)
+      if (_IO_old_do_write (f, s, count) == EOF)
 	return n - to_do;
       to_do = dont_write;
 
diff --git a/libio/oldfreopen.c b/libio/oldiofclose.c
index 705965c336..5eed0661ec 100644
--- a/libio/oldfreopen.c
+++ b/libio/oldiofclose.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -24,23 +24,35 @@
    General Public License.  */
 
 #include "libioP.h"
-#include "stdio.h"
+#ifdef __STDC__
+#include <stdlib.h>
+#endif
 
-FILE*
-__old_freopen (filename, mode, fp)
-     const char* filename;
-     const char* mode;
-     FILE* fp;
+int
+_IO_old_fclose (fp)
+     _IO_FILE *fp;
 {
-  FILE *result;
-  CHECK_FILE (fp, NULL);
-  if (!(fp->_flags & _IO_IS_FILEBUF))
-    return NULL;
+  int status;
+
+  CHECK_FILE(fp, EOF);
+
   _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
   _IO_flockfile (fp);
-  result = _IO_old_freopen (filename, mode, fp);
+  if (fp->_IO_file_flags & _IO_IS_FILEBUF)
+    status = _IO_old_file_close_it (fp);
+  else
+    status = fp->_flags & _IO_ERR_SEEN ? -1 : 0;
+  _IO_FINISH (fp);
   _IO_cleanup_region_end (1);
-  return result;
+  if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr)
+    {
+      fp->_IO_file_flags = 0;
+      free(fp);
+    }
+
+  return status;
 }
 
-symbol_version (__old_freopen, freopen,);
+strong_alias (_IO_old_fclose, __old_fclose)
+symbol_version (_IO_old_fclose, _IO_fclose, GLIBC_2.0);
+symbol_version (__old_fclose, fclose, GLIBC_2.0);
diff --git a/libio/oldiofopen.c b/libio/oldiofopen.c
index c37ec0309a..d0ffb02b13 100644
--- a/libio/oldiofopen.c
+++ b/libio/oldiofopen.c
@@ -49,7 +49,7 @@ _IO_old_fopen (filename, mode)
 #endif
   _IO_init (&new_f->fp.file, 0);
   _IO_JUMPS (&new_f->fp.file) = &_IO_old_file_jumps;
-  _IO_file_init (&new_f->fp.file);
+  _IO_old_file_init (&new_f->fp.file);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fp.vtable = NULL;
 #endif
@@ -61,5 +61,5 @@ _IO_old_fopen (filename, mode)
 }
 
 strong_alias (_IO_old_fopen, __old_fopen)
-symbol_version (_IO_old_fopen, _IO_fopen,);
-symbol_version (__old_fopen, fopen,);
+symbol_version (_IO_old_fopen, _IO_fopen, GLIBC_2.0);
+symbol_version (__old_fopen, fopen, GLIBC_2.0);
diff --git a/libio/oldstdfiles.c b/libio/oldstdfiles.c
index 3017109581..64c792f7a0 100644
--- a/libio/oldstdfiles.c
+++ b/libio/oldstdfiles.c
@@ -36,22 +36,52 @@
 #define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
   static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \
   struct _IO_FILE_plus INAME \
-    = {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps}; \
-  symbol_version (INAME, NAME,)
+    = {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps};
 #else
 #define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
   struct _IO_FILE_plus INAME \
-    = {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps}; \
-  symbol_version (INAME, NAME,)
+    = {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps};
 #endif
 
-DEF_STDFILE(_IO_old_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
-DEF_STDFILE(_IO_old_stdout_, _IO_stdout_, 1, &_IO_stdin_.plus.file,
+DEF_STDFILE(_IO_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
+DEF_STDFILE(_IO_stdout_, _IO_stdout_, 1, &_IO_stdin_.file,
 	    _IO_NO_READS);
-DEF_STDFILE(_IO_old_stderr_, _IO_stderr_, 2, &_IO_stdout_.plus.file,
+DEF_STDFILE(_IO_stderr_, _IO_stderr_, 2, &_IO_stdout_.file,
             _IO_NO_READS+_IO_UNBUFFERED);
 
-#if 0
-_IO_FILE *_IO_old_list_all = &_IO_stderr_.plus.file;
-symbol_version (_IO_old_list_all, _IO_list_all,);
+#if defined __GNUC__ && __GNUC__ >= 2
+
+#include <stdio.h>
+
+extern void * _IO_stdin_used;
+weak_extern (_IO_stdin_used);
+
+#undef stdin
+#undef stdout
+#undef stderr
+
+extern FILE *stdin;
+extern FILE *stdout;
+extern FILE *stderr;
+
+extern FILE *_IO_list_all;
+
+static void _IO_check_libio __P ((void)) __attribute__ ((constructor));
+
+/* This function determines which shared C library the application
+   was linked against. We then set up the stdin/stdout/stderr and
+   _IO_list_all accordingly. */
+
+static void
+_IO_check_libio ()
+{
+  if (&_IO_stdin_used == NULL)
+    {
+      /* We are using the old one. */
+      stdin = &_IO_stdin_.file;
+      stdout = &_IO_stdout_.file;
+      stderr = _IO_list_all = &_IO_stderr_.file;
+    }
+}
+
 #endif
diff --git a/libio/stdfiles.c b/libio/stdfiles.c
index 7eb828350c..c70d47423d 100644
--- a/libio/stdfiles.c
+++ b/libio/stdfiles.c
@@ -36,22 +36,17 @@
 #define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
   static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \
   struct _IO_FILE_complete INAME \
-    = {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},}; \
-  default_symbol_version (INAME, NAME, GLIBC_2.1)
+    = {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},};
 #else
 #define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
   struct _IO_FILE_complete INAME \
-    = {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},}; \
-  default_symbol_version (INAME, NAME, GLIBC_2.1)
+    = {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},};
 #endif
 
-DEF_STDFILE(_IO_new_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
-DEF_STDFILE(_IO_new_stdout_, _IO_stdout_, 1, &_IO_stdin_.plus.file,
+DEF_STDFILE(_IO_2_1_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
+DEF_STDFILE(_IO_2_1_stdout_, _IO_stdout_, 1, &_IO_2_1_stdin_.plus.file,
 	    _IO_NO_READS);
-DEF_STDFILE(_IO_new_stderr_, _IO_stderr_, 2, &_IO_stdout_.plus.file,
+DEF_STDFILE(_IO_2_1_stderr_, _IO_stderr_, 2, &_IO_2_1_stdout_.plus.file,
             _IO_NO_READS+_IO_UNBUFFERED);
 
-_IO_FILE *_IO_list_all = &_IO_stderr_.plus.file;
-#if 0
-default_symbol_version (_IO_new_list_all, _IO_list_all, GLIBC_2.1);
-#endif
+_IO_FILE *_IO_list_all = &_IO_2_1_stderr_.plus.file;
diff --git a/libio/stdio.c b/libio/stdio.c
index d38379f821..abea7f38ba 100644
--- a/libio/stdio.c
+++ b/libio/stdio.c
@@ -29,6 +29,13 @@
 #undef stdin
 #undef stdout
 #undef stderr
-FILE *stdin = &_IO_stdin_.plus.file;
-FILE *stdout = &_IO_stdout_.plus.file;
-FILE *stderr = &_IO_stderr_.plus.file;
+FILE *stdin = &_IO_2_1_stdin_.plus.file;
+FILE *stdout = &_IO_2_1_stdout_.plus.file;
+FILE *stderr = &_IO_2_1_stderr_.plus.file;
+
+#undef _IO_stdin
+#undef _IO_stdout
+#undef _IO_stderr
+strong_alias (stdin, _IO_stdin);
+strong_alias (stdout, _IO_stdout);
+strong_alias (stderr, _IO_stderr);