1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29: #include "libioP.h"
30: #ifdef __STDC__
31: #include <stdlib.h>
32: #include <stddef.h>
33: #endif
34: #ifdef _LIBC
35: # include <shlib-compat.h>
36: #else
37: # define _IO_new_fopen fopen
38: #endif
39:
40: _IO_FILE *
41: __fopen_maybe_mmap (fp)
42: _IO_FILE *fp;
43: {
44: #ifdef _G_HAVE_MMAP
45: if ((fp->_flags2 & _IO_FLAGS2_MMAP) && (fp->_flags & _IO_NO_WRITES))
46: {
47:
48:
49:
50:
51:
52: if (fp->_mode <= 0)
53: _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps_maybe_mmap;
54: else
55: _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_wfile_jumps_maybe_mmap;
56: fp->_wide_data->_wide_vtable = &_IO_wfile_jumps_maybe_mmap;
57: }
58: #endif
59: return fp;
60: }
61:
62:
63: _IO_FILE *
64: __fopen_internal (filename, mode, is32)
65: const char *filename;
66: const char *mode;
67: int is32;
68: {
69: struct locked_FILE
70: {
71: struct _IO_FILE_plus fp;
72: #ifdef _IO_MTSAFE_IO
73: _IO_lock_t lock;
74: #endif
75: struct _IO_wide_data wd;
76: } *new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
77:
78: if (new_f == NULL)
79: return NULL;
80: #ifdef _IO_MTSAFE_IO
81: new_f->fp.file._lock = &new_f->lock;
82: #endif
83: #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
84: _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &_IO_wfile_jumps);
85: #else
86: _IO_no_init (&new_f->fp.file, 1, 0, NULL, NULL);
87: #endif
88: _IO_JUMPS (&new_f->fp) = &_IO_file_jumps;
89: INTUSE(_IO_file_init) (&new_f->fp);
90: #if !_IO_UNIFIED_JUMPTABLES
91: new_f->fp.vtable = NULL;
92: #endif
93: if (INTUSE(_IO_file_fopen) ((_IO_FILE *) new_f, filename, mode, is32)
94: != NULL)
95: return __fopen_maybe_mmap (&new_f->fp.file);
96:
97: INTUSE(_IO_un_link) (&new_f->fp);
98: free (new_f);
99: return NULL;
100: }
101:
102: _IO_FILE *
103: _IO_new_fopen (filename, mode)
104: const char *filename;
105: const char *mode;
106: {
107: return __fopen_internal (filename, mode, 1);
108: }
109:
110: #ifdef _LIBC
111: strong_alias (_IO_new_fopen, __new_fopen)
112: versioned_symbol (libc, _IO_new_fopen, _IO_fopen, GLIBC_2_1);
113: versioned_symbol (libc, __new_fopen, fopen, GLIBC_2_1);
114: #endif