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: #include "libioP.h"
29: #ifdef __STDC__
30: #include <stdlib.h>
31: #endif
32: #if _LIBC
33: # include "../iconv/gconv_int.h"
34: # include <shlib-compat.h>
35: #else
36: # define SHLIB_COMPAT(a, b, c) 0
37: # define _IO_new_fclose fclose
38: #endif
39:
40: int
41: _IO_new_fclose (fp)
42: _IO_FILE *fp;
43: {
44: int status;
45:
46: CHECK_FILE(fp, EOF);
47:
48: #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
49:
50:
51:
52: if (_IO_vtable_offset (fp) != 0)
53: return _IO_old_fclose (fp);
54: #endif
55:
56:
57: if (fp->_IO_file_flags & _IO_IS_FILEBUF)
58: INTUSE(_IO_un_link) ((struct _IO_FILE_plus *) fp);
59:
60: _IO_acquire_lock (fp);
61: if (fp->_IO_file_flags & _IO_IS_FILEBUF)
62: status = INTUSE(_IO_file_close_it) (fp);
63: else
64: status = fp->_flags & _IO_ERR_SEEN ? -1 : 0;
65: _IO_release_lock (fp);
66: _IO_FINISH (fp);
67: if (fp->_mode > 0)
68: {
69: #if _LIBC
70:
71:
72: struct _IO_codecvt *cc = fp->_codecvt;
73:
74: __libc_lock_lock (__gconv_lock);
75: __gconv_release_step (cc->__cd_in.__cd.__steps);
76: __gconv_release_step (cc->__cd_out.__cd.__steps);
77: __libc_lock_unlock (__gconv_lock);
78: #endif
79: }
80: else
81: {
82: if (_IO_have_backup (fp))
83: INTUSE(_IO_free_backup_area) (fp);
84: }
85: if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr)
86: {
87: fp->_IO_file_flags = 0;
88: free(fp);
89: }
90:
91: return status;
92: }
93:
94: #ifdef _LIBC
95: versioned_symbol (libc, _IO_new_fclose, _IO_fclose, GLIBC_2_1);
96: strong_alias (_IO_new_fclose, __new_fclose)
97: versioned_symbol (libc, __new_fclose, fclose, GLIBC_2_1);
98: #endif