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