cosmopolitan/third_party/python/Include/fileutils.h
Justine Tunney b420ed8248 Undiamond Python headers
This change gets the Python codebase into a state where it conforms to
the conventions of this codebase. It's now possible to include headers
from Python, without worrying about ordering. Python has traditionally
solved that problem by "diamonding" everything in Python.h, but that's
problematic since it means any change to any Python header invalidates
all the build artifacts. Lastly it makes tooling not work. Since it is
hard to explain to Emacs when I press C-c C-h to add an import line it
shouldn't add the header that actually defines the symbol, and instead
do follow the nonstandard Python convention.

Progress has been made on letting Python load source code from the zip
executable structure via the standard C library APIs. System calss now
recognizes zip!FILENAME alternative URIs as equivalent to zip:FILENAME
since Python uses colon as its delimiter.

Some progress has been made on embedding the notice license terms into
the Python object code. This is easier said than done since Python has
an extremely complicated ownership story.

- Some termios APIs have been added
- Implement rewinddir() dirstream API
- GetCpuCount() API added to Cosmopolitan Libc
- More bugs in Cosmopolitan Libc have been fixed
- zipobj.com now has flags for mangling the path
- Fixed bug a priori with sendfile() on certain BSDs
- Polyfill F_DUPFD and F_DUPFD_CLOEXEC across platforms
- FIOCLEX / FIONCLEX now polyfilled for fast O_CLOEXEC changes
- APE now supports a hybrid solution to no-self-modify for builds
- Many BSD-only magnums added, e.g. O_SEARCH, O_SHLOCK, SF_NODISKIO
2021-08-12 14:07:40 -07:00

156 lines
3.2 KiB
C

#ifndef Py_FILEUTILS_H
#define Py_FILEUTILS_H
#include "libc/calls/struct/stat.h"
#include "third_party/python/Include/object.h"
COSMOPOLITAN_C_START_
/* clang-format off */
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
wchar_t * Py_DecodeLocale(
const char *arg,
size_t *size);
char* Py_EncodeLocale(
const wchar_t *text,
size_t *error_pos);
#endif
#ifndef Py_LIMITED_API
wchar_t * _Py_DecodeLocaleEx(
const char *arg,
size_t *size,
int current_locale);
char* _Py_EncodeLocaleEx(
const wchar_t *text,
size_t *error_pos,
int current_locale);
PyObject * _Py_device_encoding(int);
#if defined(MS_WINDOWS) || defined(__APPLE__)
/* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611).
On macOS 10.13, read() and write() with more than INT_MAX bytes
fail with EINVAL (bpo-24658). */
# define _PY_READ_MAX INT_MAX
# define _PY_WRITE_MAX INT_MAX
#else
/* write() should truncate the input to PY_SSIZE_T_MAX bytes,
but it's safer to do it ourself to have a portable behaviour */
# define _PY_READ_MAX PY_SSIZE_T_MAX
# define _PY_WRITE_MAX PY_SSIZE_T_MAX
#endif
#ifdef MS_WINDOWS
struct _Py_stat_struct {
unsigned long st_dev;
uint64_t st_ino;
unsigned short st_mode;
int st_nlink;
int st_uid;
int st_gid;
unsigned long st_rdev;
__int64 st_size;
time_t st_atime;
int st_atime_nsec;
time_t st_mtime;
int st_mtime_nsec;
time_t st_ctime;
int st_ctime_nsec;
unsigned long st_file_attributes;
};
#else
# define _Py_stat_struct stat
#endif
int _Py_fstat(
int fd,
struct _Py_stat_struct *status);
int _Py_fstat_noraise(
int fd,
struct _Py_stat_struct *status);
int _Py_stat(
PyObject *path,
struct stat *status);
int _Py_open(
const char *pathname,
int flags);
int _Py_open_noraise(
const char *pathname,
int flags);
FILE * _Py_wfopen(
const wchar_t *path,
const wchar_t *mode);
FILE* _Py_fopen(
const char *pathname,
const char *mode);
FILE* _Py_fopen_obj(
PyObject *path,
const char *mode);
Py_ssize_t _Py_read(
int fd,
void *buf,
size_t count);
Py_ssize_t _Py_write(
int fd,
const void *buf,
size_t count);
Py_ssize_t _Py_write_noraise(
int fd,
const void *buf,
size_t count);
#ifdef HAVE_READLINK
int _Py_wreadlink(
const wchar_t *path,
wchar_t *buf,
size_t bufsiz);
#endif
#ifdef HAVE_REALPATH
wchar_t* _Py_wrealpath(
const wchar_t *path,
wchar_t *resolved_path,
size_t resolved_path_size);
#endif
wchar_t* _Py_wgetcwd(
wchar_t *buf,
size_t size);
int _Py_get_inheritable(int fd);
int _Py_set_inheritable(int fd, int inheritable,
int *atomic_flag_works);
int _Py_set_inheritable_async_safe(int fd, int inheritable,
int *atomic_flag_works);
int _Py_dup(int fd);
#ifndef MS_WINDOWS
int _Py_get_blocking(int fd);
int _Py_set_blocking(int fd, int blocking);
#endif /* !MS_WINDOWS */
int _Py_GetLocaleconvNumeric(
PyObject **decimal_point,
PyObject **thousands_sep,
const char **grouping);
#endif /* Py_LIMITED_API */
COSMOPOLITAN_C_END_
#endif /* !Py_FILEUTILS_H */