/home/mdboom/Work/builds/cpython/Include/internal/pycore_fileutils.h
Line | Count | Source (jump to first uncovered line) |
1 | #ifndef Py_INTERNAL_FILEUTILS_H |
2 | #define Py_INTERNAL_FILEUTILS_H |
3 | #ifdef __cplusplus |
4 | extern "C" { |
5 | #endif |
6 | |
7 | #ifndef Py_BUILD_CORE |
8 | # error "Py_BUILD_CORE must be defined to include this header" |
9 | #endif |
10 | |
11 | #include <locale.h> /* struct lconv */ |
12 | |
13 | typedef enum { |
14 | _Py_ERROR_UNKNOWN=0, |
15 | _Py_ERROR_STRICT, |
16 | _Py_ERROR_SURROGATEESCAPE, |
17 | _Py_ERROR_REPLACE, |
18 | _Py_ERROR_IGNORE, |
19 | _Py_ERROR_BACKSLASHREPLACE, |
20 | _Py_ERROR_SURROGATEPASS, |
21 | _Py_ERROR_XMLCHARREFREPLACE, |
22 | _Py_ERROR_OTHER |
23 | } _Py_error_handler; |
24 | |
25 | PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); |
26 | |
27 | PyAPI_FUNC(int) _Py_DecodeLocaleEx( |
28 | const char *arg, |
29 | wchar_t **wstr, |
30 | size_t *wlen, |
31 | const char **reason, |
32 | int current_locale, |
33 | _Py_error_handler errors); |
34 | |
35 | PyAPI_FUNC(int) _Py_EncodeLocaleEx( |
36 | const wchar_t *text, |
37 | char **str, |
38 | size_t *error_pos, |
39 | const char **reason, |
40 | int current_locale, |
41 | _Py_error_handler errors); |
42 | |
43 | PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( |
44 | const wchar_t *text, |
45 | size_t *error_pos); |
46 | |
47 | PyAPI_FUNC(PyObject *) _Py_device_encoding(int); |
48 | |
49 | #if defined(MS_WINDOWS) || defined(__APPLE__) |
50 | /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). |
51 | On macOS 10.13, read() and write() with more than INT_MAX bytes |
52 | fail with EINVAL (bpo-24658). */ |
53 | # define _PY_READ_MAX INT_MAX |
54 | # define _PY_WRITE_MAX INT_MAX |
55 | #else |
56 | /* write() should truncate the input to PY_SSIZE_T_MAX bytes, |
57 | but it's safer to do it ourself to have a portable behaviour */ |
58 | # define _PY_READ_MAX PY_SSIZE_T_MAX |
59 | # define _PY_WRITE_MAX PY_SSIZE_T_MAX |
60 | #endif |
61 | |
62 | #ifdef MS_WINDOWS |
63 | struct _Py_stat_struct { |
64 | unsigned long st_dev; |
65 | uint64_t st_ino; |
66 | unsigned short st_mode; |
67 | int st_nlink; |
68 | int st_uid; |
69 | int st_gid; |
70 | unsigned long st_rdev; |
71 | __int64 st_size; |
72 | time_t st_atime; |
73 | int st_atime_nsec; |
74 | time_t st_mtime; |
75 | int st_mtime_nsec; |
76 | time_t st_ctime; |
77 | int st_ctime_nsec; |
78 | unsigned long st_file_attributes; |
79 | unsigned long st_reparse_tag; |
80 | }; |
81 | #else |
82 | # define _Py_stat_struct stat |
83 | #endif |
84 | |
85 | PyAPI_FUNC(int) _Py_fstat( |
86 | int fd, |
87 | struct _Py_stat_struct *status); |
88 | |
89 | PyAPI_FUNC(int) _Py_fstat_noraise( |
90 | int fd, |
91 | struct _Py_stat_struct *status); |
92 | |
93 | PyAPI_FUNC(int) _Py_stat( |
94 | PyObject *path, |
95 | struct stat *status); |
96 | |
97 | PyAPI_FUNC(int) _Py_open( |
98 | const char *pathname, |
99 | int flags); |
100 | |
101 | PyAPI_FUNC(int) _Py_open_noraise( |
102 | const char *pathname, |
103 | int flags); |
104 | |
105 | PyAPI_FUNC(FILE *) _Py_wfopen( |
106 | const wchar_t *path, |
107 | const wchar_t *mode); |
108 | |
109 | PyAPI_FUNC(Py_ssize_t) _Py_read( |
110 | int fd, |
111 | void *buf, |
112 | size_t count); |
113 | |
114 | PyAPI_FUNC(Py_ssize_t) _Py_write( |
115 | int fd, |
116 | const void *buf, |
117 | size_t count); |
118 | |
119 | PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( |
120 | int fd, |
121 | const void *buf, |
122 | size_t count); |
123 | |
124 | #ifdef HAVE_READLINK |
125 | PyAPI_FUNC(int) _Py_wreadlink( |
126 | const wchar_t *path, |
127 | wchar_t *buf, |
128 | /* Number of characters of 'buf' buffer |
129 | including the trailing NUL character */ |
130 | size_t buflen); |
131 | #endif |
132 | |
133 | #ifdef HAVE_REALPATH |
134 | PyAPI_FUNC(wchar_t*) _Py_wrealpath( |
135 | const wchar_t *path, |
136 | wchar_t *resolved_path, |
137 | /* Number of characters of 'resolved_path' buffer |
138 | including the trailing NUL character */ |
139 | size_t resolved_path_len); |
140 | #endif |
141 | |
142 | PyAPI_FUNC(wchar_t*) _Py_wgetcwd( |
143 | wchar_t *buf, |
144 | /* Number of characters of 'buf' buffer |
145 | including the trailing NUL character */ |
146 | size_t buflen); |
147 | |
148 | PyAPI_FUNC(int) _Py_get_inheritable(int fd); |
149 | |
150 | PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, |
151 | int *atomic_flag_works); |
152 | |
153 | PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, |
154 | int *atomic_flag_works); |
155 | |
156 | PyAPI_FUNC(int) _Py_dup(int fd); |
157 | |
158 | #ifndef MS_WINDOWS |
159 | PyAPI_FUNC(int) _Py_get_blocking(int fd); |
160 | |
161 | PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); |
162 | #else /* MS_WINDOWS */ |
163 | PyAPI_FUNC(void*) _Py_get_osfhandle_noraise(int fd); |
164 | |
165 | PyAPI_FUNC(void*) _Py_get_osfhandle(int fd); |
166 | |
167 | PyAPI_FUNC(int) _Py_open_osfhandle_noraise(void *handle, int flags); |
168 | |
169 | PyAPI_FUNC(int) _Py_open_osfhandle(void *handle, int flags); |
170 | #endif /* MS_WINDOWS */ |
171 | |
172 | // This is used after getting NULL back from Py_DecodeLocale(). |
173 | #define DECODE_LOCALE_ERR(NAME, LEN) \ |
174 | ((LEN) == (size_t)-2) \ |
175 | ? _PyStatus_ERR("cannot decode " NAME) \ |
176 | : _PyStatus_NO_MEMORY() |
177 | |
178 | PyAPI_DATA(int) _Py_HasFileSystemDefaultEncodeErrors; |
179 | |
180 | PyAPI_FUNC(int) _Py_DecodeUTF8Ex( |
181 | const char *arg, |
182 | Py_ssize_t arglen, |
183 | wchar_t **wstr, |
184 | size_t *wlen, |
185 | const char **reason, |
186 | _Py_error_handler errors); |
187 | |
188 | PyAPI_FUNC(int) _Py_EncodeUTF8Ex( |
189 | const wchar_t *text, |
190 | char **str, |
191 | size_t *error_pos, |
192 | const char **reason, |
193 | int raw_malloc, |
194 | _Py_error_handler errors); |
195 | |
196 | PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( |
197 | const char *arg, |
198 | Py_ssize_t arglen, |
199 | size_t *wlen); |
200 | |
201 | extern int |
202 | _Py_wstat(const wchar_t *, struct stat *); |
203 | |
204 | PyAPI_FUNC(int) _Py_GetForceASCII(void); |
205 | |
206 | /* Reset "force ASCII" mode (if it was initialized). |
207 | |
208 | This function should be called when Python changes the LC_CTYPE locale, |
209 | so the "force ASCII" mode can be detected again on the new locale |
210 | encoding. */ |
211 | PyAPI_FUNC(void) _Py_ResetForceASCII(void); |
212 | |
213 | |
214 | PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( |
215 | struct lconv *lc, |
216 | PyObject **decimal_point, |
217 | PyObject **thousands_sep); |
218 | |
219 | PyAPI_FUNC(void) _Py_closerange(int first, int last); |
220 | |
221 | PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(void); |
222 | PyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void); |
223 | |
224 | #ifdef HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION |
225 | extern int _Py_LocaleUsesNonUnicodeWchar(void); |
226 | |
227 | extern wchar_t* _Py_DecodeNonUnicodeWchar( |
228 | const wchar_t* native, |
229 | Py_ssize_t size); |
230 | |
231 | extern int _Py_EncodeNonUnicodeWchar_InPlace( |
232 | wchar_t* unicode, |
233 | Py_ssize_t size); |
234 | #endif |
235 | |
236 | extern int _Py_isabs(const wchar_t *path); |
237 | extern int _Py_abspath(const wchar_t *path, wchar_t **abspath_p); |
238 | #ifdef MS_WINDOWS |
239 | extern int _PyOS_getfullpathname(const wchar_t *path, wchar_t **abspath_p); |
240 | #endif |
241 | extern wchar_t * _Py_join_relfile(const wchar_t *dirname, |
242 | const wchar_t *relfile); |
243 | extern int _Py_add_relfile(wchar_t *dirname, |
244 | const wchar_t *relfile, |
245 | size_t bufsize); |
246 | extern size_t _Py_find_basename(const wchar_t *filename); |
247 | PyAPI_FUNC(wchar_t *) _Py_normpath(wchar_t *path, Py_ssize_t size); |
248 | |
249 | |
250 | // Macros to protect CRT calls against instant termination when passed an |
251 | // invalid parameter (bpo-23524). IPH stands for Invalid Parameter Handler. |
252 | // Usage: |
253 | // |
254 | // _Py_BEGIN_SUPPRESS_IPH |
255 | // ... |
256 | // _Py_END_SUPPRESS_IPH |
257 | #if defined _MSC_VER && _MSC_VER >= 1900 |
258 | |
259 | # include <stdlib.h> // _set_thread_local_invalid_parameter_handler() |
260 | |
261 | extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; |
262 | # define _Py_BEGIN_SUPPRESS_IPH \ |
263 | { _invalid_parameter_handler _Py_old_handler = \ |
264 | _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); |
265 | # define _Py_END_SUPPRESS_IPH \ |
266 | _set_thread_local_invalid_parameter_handler(_Py_old_handler); } |
267 | #else |
268 | # define _Py_BEGIN_SUPPRESS_IPH |
269 | # define _Py_END_SUPPRESS_IPH |
270 | #endif /* _MSC_VER >= 1900 */ |
271 | |
272 | #ifdef __cplusplus |
273 | } |
274 | #endif |
275 | #endif /* !Py_INTERNAL_FILEUTILS_H */ |