Coverage Report

Created: 2022-07-08 09:39

/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 */