17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_FILEUTILS_H 27db96d56Sopenharmony_ci#define Py_INTERNAL_FILEUTILS_H 37db96d56Sopenharmony_ci#ifdef __cplusplus 47db96d56Sopenharmony_ciextern "C" { 57db96d56Sopenharmony_ci#endif 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE 87db96d56Sopenharmony_ci# error "Py_BUILD_CORE must be defined to include this header" 97db96d56Sopenharmony_ci#endif 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci#include <locale.h> /* struct lconv */ 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_citypedef enum { 147db96d56Sopenharmony_ci _Py_ERROR_UNKNOWN=0, 157db96d56Sopenharmony_ci _Py_ERROR_STRICT, 167db96d56Sopenharmony_ci _Py_ERROR_SURROGATEESCAPE, 177db96d56Sopenharmony_ci _Py_ERROR_REPLACE, 187db96d56Sopenharmony_ci _Py_ERROR_IGNORE, 197db96d56Sopenharmony_ci _Py_ERROR_BACKSLASHREPLACE, 207db96d56Sopenharmony_ci _Py_ERROR_SURROGATEPASS, 217db96d56Sopenharmony_ci _Py_ERROR_XMLCHARREFREPLACE, 227db96d56Sopenharmony_ci _Py_ERROR_OTHER 237db96d56Sopenharmony_ci} _Py_error_handler; 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ciPyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_DecodeLocaleEx( 287db96d56Sopenharmony_ci const char *arg, 297db96d56Sopenharmony_ci wchar_t **wstr, 307db96d56Sopenharmony_ci size_t *wlen, 317db96d56Sopenharmony_ci const char **reason, 327db96d56Sopenharmony_ci int current_locale, 337db96d56Sopenharmony_ci _Py_error_handler errors); 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_EncodeLocaleEx( 367db96d56Sopenharmony_ci const wchar_t *text, 377db96d56Sopenharmony_ci char **str, 387db96d56Sopenharmony_ci size_t *error_pos, 397db96d56Sopenharmony_ci const char **reason, 407db96d56Sopenharmony_ci int current_locale, 417db96d56Sopenharmony_ci _Py_error_handler errors); 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ciPyAPI_FUNC(char*) _Py_EncodeLocaleRaw( 447db96d56Sopenharmony_ci const wchar_t *text, 457db96d56Sopenharmony_ci size_t *error_pos); 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _Py_device_encoding(int); 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci#if defined(MS_WINDOWS) || defined(__APPLE__) 507db96d56Sopenharmony_ci /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). 517db96d56Sopenharmony_ci On macOS 10.13, read() and write() with more than INT_MAX bytes 527db96d56Sopenharmony_ci fail with EINVAL (bpo-24658). */ 537db96d56Sopenharmony_ci# define _PY_READ_MAX INT_MAX 547db96d56Sopenharmony_ci# define _PY_WRITE_MAX INT_MAX 557db96d56Sopenharmony_ci#else 567db96d56Sopenharmony_ci /* write() should truncate the input to PY_SSIZE_T_MAX bytes, 577db96d56Sopenharmony_ci but it's safer to do it ourself to have a portable behaviour */ 587db96d56Sopenharmony_ci# define _PY_READ_MAX PY_SSIZE_T_MAX 597db96d56Sopenharmony_ci# define _PY_WRITE_MAX PY_SSIZE_T_MAX 607db96d56Sopenharmony_ci#endif 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci#ifdef MS_WINDOWS 637db96d56Sopenharmony_cistruct _Py_stat_struct { 647db96d56Sopenharmony_ci unsigned long st_dev; 657db96d56Sopenharmony_ci uint64_t st_ino; 667db96d56Sopenharmony_ci unsigned short st_mode; 677db96d56Sopenharmony_ci int st_nlink; 687db96d56Sopenharmony_ci int st_uid; 697db96d56Sopenharmony_ci int st_gid; 707db96d56Sopenharmony_ci unsigned long st_rdev; 717db96d56Sopenharmony_ci __int64 st_size; 727db96d56Sopenharmony_ci time_t st_atime; 737db96d56Sopenharmony_ci int st_atime_nsec; 747db96d56Sopenharmony_ci time_t st_mtime; 757db96d56Sopenharmony_ci int st_mtime_nsec; 767db96d56Sopenharmony_ci time_t st_ctime; 777db96d56Sopenharmony_ci int st_ctime_nsec; 787db96d56Sopenharmony_ci unsigned long st_file_attributes; 797db96d56Sopenharmony_ci unsigned long st_reparse_tag; 807db96d56Sopenharmony_ci}; 817db96d56Sopenharmony_ci#else 827db96d56Sopenharmony_ci# define _Py_stat_struct stat 837db96d56Sopenharmony_ci#endif 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_fstat( 867db96d56Sopenharmony_ci int fd, 877db96d56Sopenharmony_ci struct _Py_stat_struct *status); 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_fstat_noraise( 907db96d56Sopenharmony_ci int fd, 917db96d56Sopenharmony_ci struct _Py_stat_struct *status); 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_stat( 947db96d56Sopenharmony_ci PyObject *path, 957db96d56Sopenharmony_ci struct stat *status); 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_open( 987db96d56Sopenharmony_ci const char *pathname, 997db96d56Sopenharmony_ci int flags); 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_open_noraise( 1027db96d56Sopenharmony_ci const char *pathname, 1037db96d56Sopenharmony_ci int flags); 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ciPyAPI_FUNC(FILE *) _Py_wfopen( 1067db96d56Sopenharmony_ci const wchar_t *path, 1077db96d56Sopenharmony_ci const wchar_t *mode); 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ciPyAPI_FUNC(Py_ssize_t) _Py_read( 1107db96d56Sopenharmony_ci int fd, 1117db96d56Sopenharmony_ci void *buf, 1127db96d56Sopenharmony_ci size_t count); 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_ciPyAPI_FUNC(Py_ssize_t) _Py_write( 1157db96d56Sopenharmony_ci int fd, 1167db96d56Sopenharmony_ci const void *buf, 1177db96d56Sopenharmony_ci size_t count); 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ciPyAPI_FUNC(Py_ssize_t) _Py_write_noraise( 1207db96d56Sopenharmony_ci int fd, 1217db96d56Sopenharmony_ci const void *buf, 1227db96d56Sopenharmony_ci size_t count); 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci#ifdef HAVE_READLINK 1257db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_wreadlink( 1267db96d56Sopenharmony_ci const wchar_t *path, 1277db96d56Sopenharmony_ci wchar_t *buf, 1287db96d56Sopenharmony_ci /* Number of characters of 'buf' buffer 1297db96d56Sopenharmony_ci including the trailing NUL character */ 1307db96d56Sopenharmony_ci size_t buflen); 1317db96d56Sopenharmony_ci#endif 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci#ifdef HAVE_REALPATH 1347db96d56Sopenharmony_ciPyAPI_FUNC(wchar_t*) _Py_wrealpath( 1357db96d56Sopenharmony_ci const wchar_t *path, 1367db96d56Sopenharmony_ci wchar_t *resolved_path, 1377db96d56Sopenharmony_ci /* Number of characters of 'resolved_path' buffer 1387db96d56Sopenharmony_ci including the trailing NUL character */ 1397db96d56Sopenharmony_ci size_t resolved_path_len); 1407db96d56Sopenharmony_ci#endif 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ciPyAPI_FUNC(wchar_t*) _Py_wgetcwd( 1437db96d56Sopenharmony_ci wchar_t *buf, 1447db96d56Sopenharmony_ci /* Number of characters of 'buf' buffer 1457db96d56Sopenharmony_ci including the trailing NUL character */ 1467db96d56Sopenharmony_ci size_t buflen); 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_get_inheritable(int fd); 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, 1517db96d56Sopenharmony_ci int *atomic_flag_works); 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, 1547db96d56Sopenharmony_ci int *atomic_flag_works); 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_dup(int fd); 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci#ifndef MS_WINDOWS 1597db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_get_blocking(int fd); 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); 1627db96d56Sopenharmony_ci#else /* MS_WINDOWS */ 1637db96d56Sopenharmony_ciPyAPI_FUNC(void*) _Py_get_osfhandle_noraise(int fd); 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ciPyAPI_FUNC(void*) _Py_get_osfhandle(int fd); 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_open_osfhandle_noraise(void *handle, int flags); 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_open_osfhandle(void *handle, int flags); 1707db96d56Sopenharmony_ci#endif /* MS_WINDOWS */ 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ci// This is used after getting NULL back from Py_DecodeLocale(). 1737db96d56Sopenharmony_ci#define DECODE_LOCALE_ERR(NAME, LEN) \ 1747db96d56Sopenharmony_ci ((LEN) == (size_t)-2) \ 1757db96d56Sopenharmony_ci ? _PyStatus_ERR("cannot decode " NAME) \ 1767db96d56Sopenharmony_ci : _PyStatus_NO_MEMORY() 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ciPyAPI_DATA(int) _Py_HasFileSystemDefaultEncodeErrors; 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_DecodeUTF8Ex( 1817db96d56Sopenharmony_ci const char *arg, 1827db96d56Sopenharmony_ci Py_ssize_t arglen, 1837db96d56Sopenharmony_ci wchar_t **wstr, 1847db96d56Sopenharmony_ci size_t *wlen, 1857db96d56Sopenharmony_ci const char **reason, 1867db96d56Sopenharmony_ci _Py_error_handler errors); 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_EncodeUTF8Ex( 1897db96d56Sopenharmony_ci const wchar_t *text, 1907db96d56Sopenharmony_ci char **str, 1917db96d56Sopenharmony_ci size_t *error_pos, 1927db96d56Sopenharmony_ci const char **reason, 1937db96d56Sopenharmony_ci int raw_malloc, 1947db96d56Sopenharmony_ci _Py_error_handler errors); 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_ciPyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( 1977db96d56Sopenharmony_ci const char *arg, 1987db96d56Sopenharmony_ci Py_ssize_t arglen, 1997db96d56Sopenharmony_ci size_t *wlen); 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ciextern int 2027db96d56Sopenharmony_ci_Py_wstat(const wchar_t *, struct stat *); 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_GetForceASCII(void); 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci/* Reset "force ASCII" mode (if it was initialized). 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci This function should be called when Python changes the LC_CTYPE locale, 2097db96d56Sopenharmony_ci so the "force ASCII" mode can be detected again on the new locale 2107db96d56Sopenharmony_ci encoding. */ 2117db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_ResetForceASCII(void); 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_GetLocaleconvNumeric( 2157db96d56Sopenharmony_ci struct lconv *lc, 2167db96d56Sopenharmony_ci PyObject **decimal_point, 2177db96d56Sopenharmony_ci PyObject **thousands_sep); 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_closerange(int first, int last); 2207db96d56Sopenharmony_ci 2217db96d56Sopenharmony_ciPyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(void); 2227db96d56Sopenharmony_ciPyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void); 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci#ifdef HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION 2257db96d56Sopenharmony_ciextern int _Py_LocaleUsesNonUnicodeWchar(void); 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ciextern wchar_t* _Py_DecodeNonUnicodeWchar( 2287db96d56Sopenharmony_ci const wchar_t* native, 2297db96d56Sopenharmony_ci Py_ssize_t size); 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ciextern int _Py_EncodeNonUnicodeWchar_InPlace( 2327db96d56Sopenharmony_ci wchar_t* unicode, 2337db96d56Sopenharmony_ci Py_ssize_t size); 2347db96d56Sopenharmony_ci#endif 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ciextern int _Py_isabs(const wchar_t *path); 2377db96d56Sopenharmony_ciextern int _Py_abspath(const wchar_t *path, wchar_t **abspath_p); 2387db96d56Sopenharmony_ci#ifdef MS_WINDOWS 2397db96d56Sopenharmony_ciextern int _PyOS_getfullpathname(const wchar_t *path, wchar_t **abspath_p); 2407db96d56Sopenharmony_ci#endif 2417db96d56Sopenharmony_ciextern wchar_t * _Py_join_relfile(const wchar_t *dirname, 2427db96d56Sopenharmony_ci const wchar_t *relfile); 2437db96d56Sopenharmony_ciextern int _Py_add_relfile(wchar_t *dirname, 2447db96d56Sopenharmony_ci const wchar_t *relfile, 2457db96d56Sopenharmony_ci size_t bufsize); 2467db96d56Sopenharmony_ciextern size_t _Py_find_basename(const wchar_t *filename); 2477db96d56Sopenharmony_ciPyAPI_FUNC(wchar_t*) _Py_normpath(wchar_t *path, Py_ssize_t size); 2487db96d56Sopenharmony_ciextern wchar_t *_Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *length); 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci// Macros to protect CRT calls against instant termination when passed an 2527db96d56Sopenharmony_ci// invalid parameter (bpo-23524). IPH stands for Invalid Parameter Handler. 2537db96d56Sopenharmony_ci// Usage: 2547db96d56Sopenharmony_ci// 2557db96d56Sopenharmony_ci// _Py_BEGIN_SUPPRESS_IPH 2567db96d56Sopenharmony_ci// ... 2577db96d56Sopenharmony_ci// _Py_END_SUPPRESS_IPH 2587db96d56Sopenharmony_ci#if defined _MSC_VER && _MSC_VER >= 1900 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci# include <stdlib.h> // _set_thread_local_invalid_parameter_handler() 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; 2637db96d56Sopenharmony_ci# define _Py_BEGIN_SUPPRESS_IPH \ 2647db96d56Sopenharmony_ci { _invalid_parameter_handler _Py_old_handler = \ 2657db96d56Sopenharmony_ci _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); 2667db96d56Sopenharmony_ci# define _Py_END_SUPPRESS_IPH \ 2677db96d56Sopenharmony_ci _set_thread_local_invalid_parameter_handler(_Py_old_handler); } 2687db96d56Sopenharmony_ci#else 2697db96d56Sopenharmony_ci# define _Py_BEGIN_SUPPRESS_IPH 2707db96d56Sopenharmony_ci# define _Py_END_SUPPRESS_IPH 2717db96d56Sopenharmony_ci#endif /* _MSC_VER >= 1900 */ 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci#ifdef __cplusplus 2747db96d56Sopenharmony_ci} 2757db96d56Sopenharmony_ci#endif 2767db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_FILEUTILS_H */ 277