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 extern wchar_t *_Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *length); 249 250 251 // Macros to protect CRT calls against instant termination when passed an 252 // invalid parameter (bpo-23524). IPH stands for Invalid Parameter Handler. 253 // Usage: 254 // 255 // _Py_BEGIN_SUPPRESS_IPH 256 // ... 257 // _Py_END_SUPPRESS_IPH 258 #if defined _MSC_VER && _MSC_VER >= 1900 259 260 # include <stdlib.h> // _set_thread_local_invalid_parameter_handler() 261 262 extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; 263 # define _Py_BEGIN_SUPPRESS_IPH \ 264 { _invalid_parameter_handler _Py_old_handler = \ 265 _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); 266 # define _Py_END_SUPPRESS_IPH \ 267 _set_thread_local_invalid_parameter_handler(_Py_old_handler); } 268 #else 269 # define _Py_BEGIN_SUPPRESS_IPH 270 # define _Py_END_SUPPRESS_IPH 271 #endif /* _MSC_VER >= 1900 */ 272 273 #ifdef __cplusplus 274 } 275 #endif 276 #endif /* !Py_INTERNAL_FILEUTILS_H */ 277