diff options
Diffstat (limited to 'libio')
-rw-r--r-- | libio/genops.c | 1 | ||||
-rw-r--r-- | libio/iofdopen.c | 31 | ||||
-rw-r--r-- | libio/iofopen.c | 2 | ||||
-rw-r--r-- | libio/libio.h | 6 |
4 files changed, 34 insertions, 6 deletions
diff --git a/libio/genops.c b/libio/genops.c index 115c7dfe9a..14e6c0b47f 100644 --- a/libio/genops.c +++ b/libio/genops.c @@ -610,6 +610,7 @@ _IO_no_init (fp, flags, orientation, wd, jmp) struct _IO_jump_t *jmp; { fp->_flags = _IO_MAGIC|flags; + fp->_flags2 = 0; fp->_IO_buf_base = NULL; fp->_IO_buf_end = NULL; fp->_IO_read_base = NULL; diff --git a/libio/iofdopen.c b/libio/iofdopen.c index 2fb493e785..e122562f48 100644 --- a/libio/iofdopen.c +++ b/libio/iofdopen.c @@ -59,8 +59,10 @@ _IO_new_fdopen (fd, mode) struct _IO_wide_data wd; } *new_f; int fd_flags; + int i; + int use_mmap = 0; - switch (*mode++) + switch (*mode) { case 'r': read_write = _IO_NO_WRITES; @@ -76,8 +78,26 @@ _IO_new_fdopen (fd, mode) MAYBE_SET_EINVAL; return NULL; } - if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+')) - read_write &= _IO_IS_APPENDING; + for (i = 1; i < 5; ++i) + { + switch (*++mode) + { + case '\0': + break; + case '+': + read_write &= _IO_IS_APPENDING; + break; + case 'm': + use_mmap = 1; + continue; + case 'x': + case 'b': + default: + /* Ignore */ + continue; + } + break; + } #ifdef F_GETFL fd_flags = _IO_fcntl (fd, F_GETFL); #ifndef O_ACCMODE @@ -129,12 +149,13 @@ _IO_new_fdopen (fd, mode) call _IO_file_attach or else it will allocate a buffer immediately. */ _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, #ifdef _G_HAVE_MMAP - (read_write & _IO_NO_WRITES) ? &_IO_wfile_jumps_maybe_mmap : + (use_mmap && (read_write & _IO_NO_WRITES)) + ? &_IO_wfile_jumps_maybe_mmap : #endif &INTUSE(_IO_wfile_jumps)); _IO_JUMPS (&new_f->fp) = #ifdef _G_HAVE_MMAP - (read_write & _IO_NO_WRITES) ? &_IO_file_jumps_maybe_mmap : + (use_mmap && (read_write & _IO_NO_WRITES)) ? &_IO_file_jumps_maybe_mmap : #endif &INTUSE(_IO_file_jumps); INTUSE(_IO_file_init) (&new_f->fp); diff --git a/libio/iofopen.c b/libio/iofopen.c index 00a2c5f073..8cd68a3690 100644 --- a/libio/iofopen.c +++ b/libio/iofopen.c @@ -41,7 +41,7 @@ __fopen_maybe_mmap (fp) _IO_FILE *fp; { #ifdef _G_HAVE_MMAP - if (fp->_flags & _IO_NO_WRITES) + if ((fp->_flags2 & _IO_FLAGS2_MMAP) && (fp->_flags & _IO_NO_WRITES)) { /* Since this is read-only, we might be able to mmap the contents directly. We delay the decision until the first read attempt by diff --git a/libio/libio.h b/libio/libio.h index c8231df3ab..3c6bef9b37 100644 --- a/libio/libio.h +++ b/libio/libio.h @@ -137,6 +137,8 @@ #define _IO_BAD_SEEN 0x4000 #define _IO_USER_LOCK 0x8000 +#define _IO_FLAGS2_MMAP 1 + /* These are "formatting flags" matching the iostream fmtflags enum values. */ #define _IO_SKIPWS 01 #define _IO_LEFT 02 @@ -282,7 +284,11 @@ struct _IO_FILE { struct _IO_FILE *_chain; int _fileno; +#if 0 int _blksize; +#else + int _flags2; +#endif _IO_off_t _old_offset; /* This used to be _offset but it's too small. */ #define __HAVE_COLUMN /* temporary */ |