(root)/
Python-3.11.7/
Include/
internal/
pycore_fileutils.h
       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 */