diff options
Diffstat (limited to 'libio')
-rw-r--r-- | libio/Makefile | 2 | ||||
-rw-r--r-- | libio/fileops.c | 28 | ||||
-rw-r--r-- | libio/iosetvbuf.c | 4 | ||||
-rw-r--r-- | libio/libioP.h | 5 | ||||
-rw-r--r-- | libio/memstream.c | 2 | ||||
-rw-r--r-- | libio/tst-mmap-setvbuf.c | 82 | ||||
-rw-r--r-- | libio/vswprintf.c | 2 | ||||
-rw-r--r-- | libio/wfileops.c | 20 | ||||
-rw-r--r-- | libio/wgenops.c | 28 | ||||
-rw-r--r-- | libio/wstrops.c | 2 |
10 files changed, 115 insertions, 60 deletions
diff --git a/libio/Makefile b/libio/Makefile index 754db575a6..36c8ba60db 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -49,7 +49,7 @@ routines := \ tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc \ tst_wprintf2 tst-widetext test-fmemopen tst-ext tst-fopenloc \ tst-fgetws tst-ungetwc1 tst-ungetwc2 tst-swscanf tst-sscanf \ - bug-ungetwc1 bug-ungetwc2 + tst-mmap-setvbuf bug-ungetwc1 bug-ungetwc2 test-srcs = test-freopen all: # Make this the default target; it will be defined in Rules. diff --git a/libio/fileops.c b/libio/fileops.c index 7f833e5094..42bba7aa21 100644 --- a/libio/fileops.c +++ b/libio/fileops.c @@ -440,6 +440,32 @@ _IO_new_file_setbuf (fp, p, len) } INTDEF2(_IO_new_file_setbuf, _IO_file_setbuf) + +_IO_FILE * +_IO_file_setbuf_mmap (fp, p, len) + _IO_FILE *fp; + char *p; + _IO_ssize_t len; +{ + _IO_FILE *result; + + /* Change the function table. */ + _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps; + fp->_wide_data->_wide_vtable = &_IO_wfile_jumps; + + /* And perform the normal operation. */ + result = _IO_new_file_setbuf (fp, p, len); + + /* If the call failed, restore to using mmap. */ + if (result == NULL) + { + _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps_mmap; + fp->_wide_data->_wide_vtable = &_IO_wfile_jumps_mmap; + } + + return result; +} + static int new_do_write __P ((_IO_FILE *, const char *, _IO_size_t)); /* Write TO_DO bytes from DATA to FP. @@ -1293,7 +1319,7 @@ struct _IO_jump_t _IO_file_jumps_mmap = JUMP_INIT(xsgetn, _IO_file_xsgetn_mmap), JUMP_INIT(seekoff, _IO_file_seekoff_mmap), JUMP_INIT(seekpos, _IO_default_seekpos), - JUMP_INIT(setbuf, _IO_new_file_setbuf), + JUMP_INIT(setbuf, (_IO_setbuf_t) _IO_file_setbuf_mmap), JUMP_INIT(sync, _IO_new_file_sync), JUMP_INIT(doallocate, INTUSE(_IO_file_doallocate)), JUMP_INIT(read, INTUSE(_IO_file_read)), diff --git a/libio/iosetvbuf.c b/libio/iosetvbuf.c index addf4ed1c4..06d9f73fc4 100644 --- a/libio/iosetvbuf.c +++ b/libio/iosetvbuf.c @@ -94,10 +94,6 @@ _IO_setvbuf (fp, buf, mode, size) goto unlock_return; } result = _IO_SETBUF (fp, buf, size) == NULL ? EOF : 0; - if (result == 0 && fp->_vtable_offset == 0 && fp->_mode == 0 - && _IO_CHECK_WIDE (fp)) - /* We also have to set the buffer using the wide char function. */ - result = _IO_WSETBUF (fp, buf, size) == NULL ? EOF : 0; unlock_return: _IO_funlockfile (fp); diff --git a/libio/libioP.h b/libio/libioP.h index 553cfc9905..bfb36c30ef 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -404,8 +404,6 @@ extern void _IO_wdefault_finish __P ((_IO_FILE *, int)); extern int _IO_default_pbackfail __P ((_IO_FILE *, int)); extern wint_t _IO_wdefault_pbackfail __P ((_IO_FILE *, wint_t)); extern _IO_FILE* _IO_default_setbuf __P ((_IO_FILE *, char *, _IO_ssize_t)); -extern _IO_FILE* _IO_wdefault_setbuf __P ((_IO_FILE *, wchar_t *, - _IO_ssize_t)); extern _IO_size_t _IO_default_xsputn __P ((_IO_FILE *, const void *, _IO_size_t)); extern _IO_size_t _IO_wdefault_xsputn __P ((_IO_FILE *, const void *, @@ -532,6 +530,7 @@ extern void _IO_no_init __P ((_IO_FILE *, int, int, struct _IO_wide_data *, struct _IO_jump_t *)); extern void _IO_new_file_init __P ((struct _IO_FILE_plus *)); extern _IO_FILE* _IO_new_file_setbuf __P ((_IO_FILE *, char *, _IO_ssize_t)); +extern _IO_FILE* _IO_file_setbuf_mmap __P ((_IO_FILE *, char *, _IO_ssize_t)); extern int _IO_new_file_sync __P ((_IO_FILE *)); extern int _IO_new_file_underflow __P ((_IO_FILE *)); extern int _IO_new_file_overflow __P ((_IO_FILE *, int)); @@ -640,8 +639,6 @@ extern _IO_size_t _IO_wdefault_xsputn_internal __P ((_IO_FILE *, const void *, _IO_size_t)); extern _IO_size_t _IO_wdefault_xsgetn_internal __P ((_IO_FILE *, void *, _IO_size_t)); -extern _IO_FILE* _IO_wdefault_setbuf_internal __P ((_IO_FILE *, wchar_t *, - _IO_ssize_t)); extern int _IO_wdefault_doallocate_internal __P ((_IO_FILE *)); extern wint_t _IO_wdefault_uflow_internal __P ((_IO_FILE *)); diff --git a/libio/memstream.c b/libio/memstream.c index 2f7d834f55..ad31390633 100644 --- a/libio/memstream.c +++ b/libio/memstream.c @@ -72,7 +72,7 @@ static struct _IO_jump_t _IO_wmem_jumps = JUMP_INIT (xsgetn, (_IO_xsgetn_t) INTUSE(_IO_wdefault_xsgetn)), JUMP_INIT (seekoff, _IO_wstr_seekoff), JUMP_INIT (seekpos, _IO_default_seekpos), - JUMP_INIT (setbuf, (_IO_setbuf_t) INTUSE(_IO_wdefault_setbuf)), + JUMP_INIT (setbuf, _IO_default_setbuf), JUMP_INIT (sync, (_IO_sync_t) _IO_wmem_sync), JUMP_INIT (doallocate, INTUSE(_IO_wdefault_doallocate)), JUMP_INIT (read, _IO_default_read), diff --git a/libio/tst-mmap-setvbuf.c b/libio/tst-mmap-setvbuf.c new file mode 100644 index 0000000000..6fe9ce3482 --- /dev/null +++ b/libio/tst-mmap-setvbuf.c @@ -0,0 +1,82 @@ +/* Test setvbuf on readonly fopen (using mmap stdio). + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +int main (void) +{ + char name[] = "/tmp/tst-mmap-setvbuf.XXXXXX"; + char buf[4096]; + const char * const test = "Let's see if mmap stdio works with setvbuf.\n"; + char temp[strlen (test) + 1]; + int fd = mkstemp (name); + FILE *f; + + if (fd == -1) + { + printf ("%Zd: cannot open temporary file: %m\n", __LINE__); + exit (1); + } + + f = fdopen (fd, "w"); + if (f == NULL) + { + printf ("%Zd: cannot fdopen temporary file: %m\n", __LINE__); + exit (1); + } + + fputs (test, f); + fclose (f); + + f = fopen (name, "r"); + if (f == NULL) + { + printf ("%Zd: cannot fopen temporary file: %m\n", __LINE__); + exit (1); + } + + if (setvbuf (f, buf, _IOFBF, sizeof buf)) + { + printf ("%Zd: setvbuf failed: %m\n", __LINE__); + exit (1); + } + + if (fread (temp, 1, strlen (test), f) != strlen (test)) + { + printf ("%Zd: couldn't read the file back: %m\n", __LINE__); + exit (1); + } + temp [strlen (test)] = '\0'; + + if (strcmp (test, temp)) + { + printf ("%Zd: read different string than was written:\n%s%s", + __LINE__, test, temp); + exit (1); + } + + fclose (f); + + unlink (name); + exit (0); +} diff --git a/libio/vswprintf.c b/libio/vswprintf.c index 10d35a2e11..3ec44d1463 100644 --- a/libio/vswprintf.c +++ b/libio/vswprintf.c @@ -87,7 +87,7 @@ static struct _IO_jump_t _IO_wstrn_jumps = JUMP_INIT(xsgetn, INTUSE(_IO_wdefault_xsgetn)), JUMP_INIT(seekoff, _IO_wstr_seekoff), JUMP_INIT(seekpos, _IO_default_seekpos), - JUMP_INIT(setbuf, (_IO_setbuf_t) INTUSE(_IO_wdefault_setbuf)), + JUMP_INIT(setbuf, _IO_default_setbuf), JUMP_INIT(sync, _IO_default_sync), JUMP_INIT(doallocate, INTUSE(_IO_wdefault_doallocate)), JUMP_INIT(read, _IO_default_read), diff --git a/libio/wfileops.c b/libio/wfileops.c index 504c799010..b633daf51c 100644 --- a/libio/wfileops.c +++ b/libio/wfileops.c @@ -52,24 +52,6 @@ #endif -_IO_FILE * -_IO_wfile_setbuf (fp, p, len) - _IO_FILE *fp; - wchar_t *p; - _IO_ssize_t len; -{ - if (INTUSE(_IO_wdefault_setbuf) (fp, p, len) == NULL) - return NULL; - - fp->_wide_data->_IO_write_base = fp->_wide_data->_IO_write_ptr = - fp->_wide_data->_IO_write_end = fp->_wide_data->_IO_buf_base; - _IO_wsetg (fp, fp->_wide_data->_IO_buf_base, fp->_wide_data->_IO_buf_base, - fp->_wide_data->_IO_buf_base); - - return fp; -} - - /* Convert TO_DO wide character from DATA to FP. Then mark FP as having empty buffers. */ int @@ -877,7 +859,7 @@ struct _IO_jump_t _IO_wfile_jumps_mmap = JUMP_INIT(xsgetn, INTUSE(_IO_file_xsgetn)), JUMP_INIT(seekoff, INTUSE(_IO_wfile_seekoff)), JUMP_INIT(seekpos, _IO_default_seekpos), - JUMP_INIT(setbuf, _IO_new_file_setbuf), + JUMP_INIT(setbuf, _IO_file_setbuf_mmap), JUMP_INIT(sync, (_IO_sync_t) INTUSE(_IO_wfile_sync)), JUMP_INIT(doallocate, _IO_wfile_doallocate), JUMP_INIT(read, INTUSE(_IO_file_read)), diff --git a/libio/wgenops.c b/libio/wgenops.c index b0580e5125..e3586a7ec8 100644 --- a/libio/wgenops.c +++ b/libio/wgenops.c @@ -423,34 +423,6 @@ _IO_wdoallocbuf (fp) INTDEF(_IO_wdoallocbuf) -_IO_FILE * -_IO_wdefault_setbuf (fp, p, len) - _IO_FILE *fp; - wchar_t *p; - _IO_ssize_t len; -{ - if (_IO_SYNC (fp) == EOF) - return NULL; - if (p == NULL || len == 0) - { - fp->_flags |= _IO_UNBUFFERED; - INTUSE(_IO_wsetb) (fp, fp->_wide_data->_shortbuf, - fp->_wide_data->_shortbuf + 1, 0); - } - else - { - fp->_flags &= ~_IO_UNBUFFERED; - INTUSE(_IO_wsetb) (fp, p, p + len, 0); - } - fp->_wide_data->_IO_write_base = fp->_wide_data->_IO_write_ptr - = fp->_wide_data->_IO_write_end = 0; - fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_read_ptr - = fp->_wide_data->_IO_read_end = 0; - return fp; -} -INTDEF(_IO_wdefault_setbuf) - - int _IO_wdefault_doallocate (fp) _IO_FILE *fp; diff --git a/libio/wstrops.c b/libio/wstrops.c index 797800dba2..64cdf52aa7 100644 --- a/libio/wstrops.c +++ b/libio/wstrops.c @@ -320,7 +320,7 @@ struct _IO_jump_t _IO_wstr_jumps = JUMP_INIT(xsgetn, INTUSE(_IO_wdefault_xsgetn)), JUMP_INIT(seekoff, _IO_wstr_seekoff), JUMP_INIT(seekpos, _IO_default_seekpos), - JUMP_INIT(setbuf, (_IO_setbuf_t) INTUSE(_IO_wdefault_setbuf)), + JUMP_INIT(setbuf, _IO_default_setbuf), JUMP_INIT(sync, _IO_default_sync), JUMP_INIT(doallocate, INTUSE(_IO_wdefault_doallocate)), JUMP_INIT(read, _IO_default_read), |