summaryrefslogtreecommitdiff
path: root/libio/iofdopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'libio/iofdopen.c')
-rw-r--r--libio/iofdopen.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/libio/iofdopen.c b/libio/iofdopen.c
index 6bb19fa214..c49387b1a0 100644
--- a/libio/iofdopen.c
+++ b/libio/iofdopen.c
@@ -39,7 +39,11 @@ _IO_fdopen (fd, mode)
{
int read_write;
int posix_mode = 0;
- struct _IO_FILE_plus *fp;
+ struct locked_FILE
+ {
+ struct _IO_FILE_plus fp;
+ _IO_lock_t lock;
+ } *new_f;
int fd_flags;
switch (*mode++)
@@ -97,28 +101,29 @@ _IO_fdopen (fd, mode)
}
#endif
- fp = (struct _IO_FILE_plus *) malloc (sizeof (struct _IO_FILE_plus));
- if (fp == NULL)
+ new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
+ if (new_f == NULL)
return NULL;
- _IO_init (&fp->file, 0);
- _IO_JUMPS (&fp->file) = &_IO_file_jumps;
- _IO_file_init (&fp->file);
+ new_f->fp.file._lock = &new_f->lock;
+ _IO_init (&new_f->fp.file, 0);
+ _IO_JUMPS (&new_f->fp.file) = &_IO_file_jumps;
+ _IO_file_init (&new_f->fp.file);
#if !_IO_UNIFIED_JUMPTABLES
- fp->vtable = NULL;
+ new_f->fp.vtable = NULL;
#endif
- if (_IO_file_attach (&fp->file, fd) == NULL)
+ if (_IO_file_attach (&new_f->fp.file, fd) == NULL)
{
- _IO_un_link (&fp->file);
- free (fp);
+ _IO_un_link (&new_f->fp.file);
+ free (new_f);
return NULL;
}
- fp->file._flags &= ~_IO_DELETE_DONT_CLOSE;
+ new_f->fp.file._flags &= ~_IO_DELETE_DONT_CLOSE;
- fp->file._IO_file_flags =
- _IO_mask_flags (&fp->file, read_write,
+ new_f->fp.file._IO_file_flags =
+ _IO_mask_flags (&new_f->fp.file, read_write,
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
- return (_IO_FILE *) fp;
+ return (_IO_FILE *) &new_f->fp;
}
weak_alias (_IO_fdopen, fdopen)