summaryrefslogtreecommitdiff
path: root/libio/iofdopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'libio/iofdopen.c')
-rw-r--r--libio/iofdopen.c31
1 files changed, 26 insertions, 5 deletions
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);