diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-11-18 02:50:07 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-11-18 02:50:07 +0000 |
commit | 6973fc01278d6c8a5f309738d641a68228efe5ed (patch) | |
tree | 8a55528a374d3d945d203cd92570bcb06978e09f /libio | |
parent | fe0ec73edb48eff3785f29ddbac75cae5f8b361b (diff) | |
download | glibc-6973fc01278d6c8a5f309738d641a68228efe5ed.tar glibc-6973fc01278d6c8a5f309738d641a68228efe5ed.tar.gz glibc-6973fc01278d6c8a5f309738d641a68228efe5ed.tar.bz2 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/Makefile | 4 | ||||
-rw-r--r-- | libio/freopen.c | 21 | ||||
-rw-r--r-- | libio/iofclose.c | 13 | ||||
-rw-r--r-- | libio/iolibio.h | 2 | ||||
-rw-r--r-- | libio/libio.h | 16 | ||||
-rw-r--r-- | libio/libioP.h | 3 | ||||
-rw-r--r-- | libio/oldfileops.c | 14 | ||||
-rw-r--r-- | libio/oldiofclose.c (renamed from libio/oldfreopen.c) | 40 | ||||
-rw-r--r-- | libio/oldiofopen.c | 6 | ||||
-rw-r--r-- | libio/oldstdfiles.c | 50 | ||||
-rw-r--r-- | libio/stdfiles.c | 17 | ||||
-rw-r--r-- | libio/stdio.c | 13 |
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); |