annotate Modules/_io/fileio.c @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents d7040647d590
children 751a91e332d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1 /* Author: Daniel Stutzbach */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
2
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
3 #define PY_SSIZE_T_CLEAN
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
4 #include "Python.h"
59040
31cb61e0f2bc #7706: add include guards where they're missing; required for Windows CE
Andrew M. Kuchling <amk@amk.ca>
parents: 58624
diff changeset
5 #ifdef HAVE_SYS_TYPES_H
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
6 #include <sys/types.h>
59040
31cb61e0f2bc #7706: add include guards where they're missing; required for Windows CE
Andrew M. Kuchling <amk@amk.ca>
parents: 58624
diff changeset
7 #endif
31cb61e0f2bc #7706: add include guards where they're missing; required for Windows CE
Andrew M. Kuchling <amk@amk.ca>
parents: 58624
diff changeset
8 #ifdef HAVE_SYS_STAT_H
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
9 #include <sys/stat.h>
59040
31cb61e0f2bc #7706: add include guards where they're missing; required for Windows CE
Andrew M. Kuchling <amk@amk.ca>
parents: 58624
diff changeset
10 #endif
31cb61e0f2bc #7706: add include guards where they're missing; required for Windows CE
Andrew M. Kuchling <amk@amk.ca>
parents: 58624
diff changeset
11 #ifdef HAVE_FCNTL_H
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
12 #include <fcntl.h>
59040
31cb61e0f2bc #7706: add include guards where they're missing; required for Windows CE
Andrew M. Kuchling <amk@amk.ca>
parents: 58624
diff changeset
13 #endif
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
14 #include <stddef.h> /* For offsetof */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
15 #include "_iomodule.h"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
16
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
17 /*
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
18 * Known likely problems:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
19 *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
20 * - Files larger then 2**32-1
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
21 * - Files with unicode filenames
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
22 * - Passing numbers greater than 2**32-1 when an integer is expected
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
23 * - Making it work on Windows and other oddball platforms
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
24 *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
25 * To Do:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
26 *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
27 * - autoconfify header file inclusion
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
28 */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
29
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
30 #ifdef MS_WINDOWS
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
31 /* can simulate truncate with Win32 API functions; see file_truncate */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
32 #define HAVE_FTRUNCATE
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
33 #define WIN32_LEAN_AND_MEAN
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
34 #include <windows.h>
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
35 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
36
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
37 #if BUFSIZ < (8*1024)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
38 #define SMALLCHUNK (8*1024)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
39 #elif (BUFSIZ >= (2 << 25))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
40 #error "unreasonable BUFSIZ > 64MB defined"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
41 #else
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
42 #define SMALLCHUNK BUFSIZ
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
43 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
44
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
45 typedef struct {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
46 PyObject_HEAD
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
47 int fd;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
48 unsigned int readable : 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
49 unsigned int writable : 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
50 signed int seekable : 2; /* -1 means unknown */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
51 unsigned int closefd : 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
52 PyObject *weakreflist;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
53 PyObject *dict;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
54 } fileio;
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
55
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
56 PyTypeObject PyFileIO_Type;
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
57
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
58 #define PyFileIO_Check(op) (PyObject_TypeCheck((op), &PyFileIO_Type))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
59
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
60 int
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
61 _PyFileIO_closed(PyObject *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
62 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
63 return ((fileio *)self)->fd < 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
64 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
65
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
66 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
67 portable_lseek(int fd, PyObject *posobj, int whence);
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
68
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
69 static PyObject *portable_lseek(int fd, PyObject *posobj, int whence);
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
70
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
71 /* Returns 0 on success, -1 with exception set on failure. */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
72 static int
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
73 internal_close(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
74 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
75 int err = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
76 int save_errno = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
77 if (self->fd >= 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
78 int fd = self->fd;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
79 self->fd = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
80 /* fd is accessible and someone else may have closed it */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
81 if (_PyVerify_fd(fd)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
82 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
83 err = close(fd);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
84 if (err < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
85 save_errno = errno;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
86 Py_END_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
87 } else {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
88 save_errno = errno;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
89 err = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
90 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
91 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
92 if (err < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
93 errno = save_errno;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
94 PyErr_SetFromErrno(PyExc_IOError);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
95 return -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
96 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
97 return 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
98 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
99
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
100 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
101 fileio_close(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
102 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
103 if (!self->closefd) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
104 self->fd = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
105 Py_RETURN_NONE;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
106 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
107 errno = internal_close(self);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
108 if (errno < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
109 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
110
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
111 return PyObject_CallMethod((PyObject*)&PyRawIOBase_Type,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
112 "close", "O", self);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
113 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
114
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
115 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
116 fileio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
117 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
118 fileio *self;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
119
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
120 assert(type != NULL && type->tp_alloc != NULL);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
121
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
122 self = (fileio *) type->tp_alloc(type, 0);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
123 if (self != NULL) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
124 self->fd = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
125 self->readable = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
126 self->writable = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
127 self->seekable = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
128 self->closefd = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
129 self->weakreflist = NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
130 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
131
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
132 return (PyObject *) self;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
133 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
134
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
135 /* On Unix, open will succeed for directories.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
136 In Python, there should be no file objects referring to
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
137 directories, so we need a check. */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
138
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
139 static int
77956
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
140 dircheck(fileio* self, PyObject *nameobj)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
141 {
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
142 #if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
143 struct stat buf;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
144 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
145 return 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
146 if (fstat(self->fd, &buf) == 0 && S_ISDIR(buf.st_mode)) {
77956
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
147 errno = EISDIR;
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
148 PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, nameobj);
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
149 return -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
150 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
151 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
152 return 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
153 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
154
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
155 static int
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
156 check_fd(int fd)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
157 {
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
158 #if defined(HAVE_FSTAT)
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
159 struct stat buf;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
160 if (!_PyVerify_fd(fd) || (fstat(fd, &buf) < 0 && errno == EBADF)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
161 PyObject *exc;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
162 char *msg = strerror(EBADF);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
163 exc = PyObject_CallFunction(PyExc_OSError, "(is)",
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
164 EBADF, msg);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
165 PyErr_SetObject(PyExc_OSError, exc);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
166 Py_XDECREF(exc);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
167 return -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
168 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
169 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
170 return 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
171 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
172
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
173
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
174 static int
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
175 fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
176 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
177 fileio *self = (fileio *) oself;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
178 static char *kwlist[] = {"file", "mode", "closefd", NULL};
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
179 const char *name = NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
180 PyObject *nameobj, *stringobj = NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
181 char *mode = "r";
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
182 char *s;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
183 #ifdef MS_WINDOWS
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
184 Py_UNICODE *widename = NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
185 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
186 int ret = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
187 int rwa = 0, plus = 0, append = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
188 int flags = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
189 int fd = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
190 int closefd = 1;
77537
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 77134
diff changeset
191 int fd_is_own = 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
192
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
193 assert(PyFileIO_Check(oself));
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
194 if (self->fd >= 0) {
77134
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 72909
diff changeset
195 if (self->closefd) {
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 72909
diff changeset
196 /* Have to close the existing file first. */
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 72909
diff changeset
197 if (internal_close(self) < 0)
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 72909
diff changeset
198 return -1;
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 72909
diff changeset
199 }
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 72909
diff changeset
200 else
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 72909
diff changeset
201 self->fd = -1;
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
202 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
203
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
204 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:fileio",
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
205 kwlist, &nameobj, &mode, &closefd))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
206 return -1;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
207
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
208 if (PyFloat_Check(nameobj)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
209 PyErr_SetString(PyExc_TypeError,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
210 "integer argument expected, got float");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
211 return -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
212 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
213
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
214 fd = PyLong_AsLong(nameobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
215 if (fd < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
216 if (!PyErr_Occurred()) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
217 PyErr_SetString(PyExc_ValueError,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
218 "Negative filedescriptor");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
219 return -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
220 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
221 PyErr_Clear();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
222 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
223
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
224 #ifdef MS_WINDOWS
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
225 if (PyUnicode_Check(nameobj))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
226 widename = PyUnicode_AS_UNICODE(nameobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
227 if (widename == NULL)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
228 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
229 if (fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
230 {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
231 if (PyBytes_Check(nameobj) || PyByteArray_Check(nameobj)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
232 Py_ssize_t namelen;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
233 if (PyObject_AsCharBuffer(nameobj, &name, &namelen) < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
234 return -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
235 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
236 else {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
237 PyObject *u = PyUnicode_FromObject(nameobj);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
238
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
239 if (u == NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
240 return -1;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
241
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
242 stringobj = PyUnicode_AsEncodedString(
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
243 u, Py_FileSystemDefaultEncoding, NULL);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
244 Py_DECREF(u);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
245 if (stringobj == NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
246 return -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
247 if (!PyBytes_Check(stringobj)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
248 PyErr_SetString(PyExc_TypeError,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
249 "encoder failed to return bytes");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
250 goto error;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
251 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
252 name = PyBytes_AS_STRING(stringobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
253 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
254 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
255
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
256 s = mode;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
257 while (*s) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
258 switch (*s++) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
259 case 'r':
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
260 if (rwa) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
261 bad_mode:
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
262 PyErr_SetString(PyExc_ValueError,
66462
835c176239d0 Merged revisions 85768-85771,85773,85777,85823,85825 via svnmerge from
Georg Brandl <georg@python.org>
parents: 65807
diff changeset
263 "Must have exactly one of read/write/append "
835c176239d0 Merged revisions 85768-85771,85773,85777,85823,85825 via svnmerge from
Georg Brandl <georg@python.org>
parents: 65807
diff changeset
264 "mode and at most one plus");
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
265 goto error;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
266 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
267 rwa = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
268 self->readable = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
269 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
270 case 'w':
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
271 if (rwa)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
272 goto bad_mode;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
273 rwa = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
274 self->writable = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
275 flags |= O_CREAT | O_TRUNC;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
276 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
277 case 'a':
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
278 if (rwa)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
279 goto bad_mode;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
280 rwa = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
281 self->writable = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
282 flags |= O_CREAT;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
283 append = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
284 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
285 case 'b':
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
286 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
287 case '+':
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
288 if (plus)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
289 goto bad_mode;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
290 self->readable = self->writable = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
291 plus = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
292 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
293 default:
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
294 PyErr_Format(PyExc_ValueError,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
295 "invalid mode: %.200s", mode);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
296 goto error;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
297 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
298 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
299
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
300 if (!rwa)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
301 goto bad_mode;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
302
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
303 if (self->readable && self->writable)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
304 flags |= O_RDWR;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
305 else if (self->readable)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
306 flags |= O_RDONLY;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
307 else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
308 flags |= O_WRONLY;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
309
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
310 #ifdef O_BINARY
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
311 flags |= O_BINARY;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
312 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
313
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
314 #ifdef O_APPEND
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
315 if (append)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
316 flags |= O_APPEND;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
317 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
318
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
319 if (fd >= 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
320 if (check_fd(fd))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
321 goto error;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
322 self->fd = fd;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
323 self->closefd = closefd;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
324 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
325 else {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
326 self->closefd = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
327 if (!closefd) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
328 PyErr_SetString(PyExc_ValueError,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
329 "Cannot use closefd=False with file name");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
330 goto error;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
331 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
332
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
333 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
334 errno = 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
335 #ifdef MS_WINDOWS
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
336 if (widename != NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
337 self->fd = _wopen(widename, flags, 0666);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
338 else
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
339 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
340 self->fd = open(name, flags, 0666);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
341 Py_END_ALLOW_THREADS
77537
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 77134
diff changeset
342 fd_is_own = 1;
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
343 if (self->fd < 0) {
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
344 #ifdef MS_WINDOWS
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
345 if (widename != NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
346 PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
347 else
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
348 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
349 PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
350 goto error;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
351 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
352 }
77956
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
353 if (dircheck(self, nameobj) < 0)
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
354 goto error;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
355
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
356 if (PyObject_SetAttrString((PyObject *)self, "name", nameobj) < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
357 goto error;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
358
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
359 if (append) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
360 /* For consistent behaviour, we explicitly seek to the
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
361 end of file (otherwise, it might be done only on the
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
362 first write()). */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
363 PyObject *pos = portable_lseek(self->fd, NULL, 2);
77537
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 77134
diff changeset
364 if (pos == NULL)
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
365 goto error;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
366 Py_DECREF(pos);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
367 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
368
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
369 goto done;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
370
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
371 error:
77537
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 77134
diff changeset
372 if (!fd_is_own)
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 77134
diff changeset
373 self->fd = -1;
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 77134
diff changeset
374
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
375 ret = -1;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
376
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
377 done:
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
378 Py_CLEAR(stringobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
379 return ret;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
380 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
381
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
382 static int
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
383 fileio_traverse(fileio *self, visitproc visit, void *arg)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
384 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
385 Py_VISIT(self->dict);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
386 return 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
387 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
388
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
389 static int
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
390 fileio_clear(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
391 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
392 Py_CLEAR(self->dict);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
393 return 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
394 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
395
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
396 static void
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
397 fileio_dealloc(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
398 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
399 if (_PyIOBase_finalize((PyObject *) self) < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
400 return;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
401 _PyObject_GC_UNTRACK(self);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
402 if (self->weakreflist != NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
403 PyObject_ClearWeakRefs((PyObject *) self);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
404 Py_CLEAR(self->dict);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
405 Py_TYPE(self)->tp_free((PyObject *)self);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
406 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
407
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
408 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
409 err_closed(void)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
410 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
411 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
412 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
413 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
414
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
415 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
416 err_mode(char *action)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
417 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
418 PyErr_Format(PyExc_ValueError, "File not open for %s", action);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
419 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
420 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
421
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
422 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
423 fileio_fileno(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
424 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
425 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
426 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
427 return PyInt_FromLong((long) self->fd);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
428 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
429
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
430 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
431 fileio_readable(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
432 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
433 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
434 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
435 return PyBool_FromLong((long) self->readable);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
436 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
437
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
438 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
439 fileio_writable(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
440 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
441 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
442 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
443 return PyBool_FromLong((long) self->writable);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
444 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
445
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
446 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
447 fileio_seekable(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
448 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
449 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
450 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
451 if (self->seekable < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
452 PyObject *pos = portable_lseek(self->fd, NULL, SEEK_CUR);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
453 if (pos == NULL) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
454 PyErr_Clear();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
455 self->seekable = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
456 } else {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
457 Py_DECREF(pos);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
458 self->seekable = 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
459 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
460 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
461 return PyBool_FromLong((long) self->seekable);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
462 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
463
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
464 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
465 fileio_readinto(fileio *self, PyObject *args)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
466 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
467 Py_buffer pbuf;
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
468 Py_ssize_t n, len;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
469
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
470 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
471 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
472 if (!self->readable)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
473 return err_mode("reading");
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
474
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
475 if (!PyArg_ParseTuple(args, "w*", &pbuf))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
476 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
477
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
478 if (_PyVerify_fd(self->fd)) {
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
479 len = pbuf.len;
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
480 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
481 errno = 0;
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
482 #if defined(MS_WIN64) || defined(MS_WINDOWS)
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
483 if (len > INT_MAX)
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
484 len = INT_MAX;
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
485 n = read(self->fd, pbuf.buf, (int)len);
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
486 #else
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
487 n = read(self->fd, pbuf.buf, len);
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
488 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
489 Py_END_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
490 } else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
491 n = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
492 PyBuffer_Release(&pbuf);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
493 if (n < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
494 if (errno == EAGAIN)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
495 Py_RETURN_NONE;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
496 PyErr_SetFromErrno(PyExc_IOError);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
497 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
498 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
499
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
500 return PyLong_FromSsize_t(n);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
501 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
502
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
503 static size_t
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
504 new_buffersize(fileio *self, size_t currentsize)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
505 {
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
506 #ifdef HAVE_FSTAT
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
507 off_t pos, end;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
508 struct stat st;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
509 if (fstat(self->fd, &st) == 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
510 end = st.st_size;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
511 pos = lseek(self->fd, 0L, SEEK_CUR);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
512 /* Files claiming a size smaller than SMALLCHUNK may
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
513 actually be streaming pseudo-files. In this case, we
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
514 apply the more aggressive algorithm below.
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
515 */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
516 if (end >= SMALLCHUNK && end >= pos && pos >= 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
517 /* Add 1 so if the file were to grow we'd notice. */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
518 return currentsize + end - pos + 1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
519 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
520 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
521 #endif
72909
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 71223
diff changeset
522 /* Expand the buffer by an amount proportional to the current size,
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 71223
diff changeset
523 giving us amortized linear-time behavior. Use a less-than-double
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 71223
diff changeset
524 growth factor to avoid excessive allocation. */
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 71223
diff changeset
525 return currentsize + (currentsize >> 3) + 6;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
526 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
527
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
528 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
529 fileio_readall(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
530 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
531 PyObject *result;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
532 Py_ssize_t total = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
533 int n;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
534
70384
f2414bb35c96 Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError if
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66462
diff changeset
535 if (self->fd < 0)
f2414bb35c96 Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError if
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66462
diff changeset
536 return err_closed();
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
537 if (!_PyVerify_fd(self->fd))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
538 return PyErr_SetFromErrno(PyExc_IOError);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
539
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
540 result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
541 if (result == NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
542 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
543
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
544 while (1) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
545 size_t newsize = new_buffersize(self, total);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
546 if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
547 PyErr_SetString(PyExc_OverflowError,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
548 "unbounded read returned more bytes "
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
549 "than a Python string can hold ");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
550 Py_DECREF(result);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
551 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
552 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
553
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
554 if (PyBytes_GET_SIZE(result) < (Py_ssize_t)newsize) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
555 if (_PyBytes_Resize(&result, newsize) < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
556 if (total == 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
557 Py_DECREF(result);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
558 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
559 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
560 PyErr_Clear();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
561 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
562 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
563 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
564 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
565 errno = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
566 n = read(self->fd,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
567 PyBytes_AS_STRING(result) + total,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
568 newsize - total);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
569 Py_END_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
570 if (n == 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
571 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
572 if (n < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
573 if (total > 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
574 break;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
575 if (errno == EAGAIN) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
576 Py_DECREF(result);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
577 Py_RETURN_NONE;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
578 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
579 Py_DECREF(result);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
580 PyErr_SetFromErrno(PyExc_IOError);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
581 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
582 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
583 total += n;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
584 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
585
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
586 if (PyBytes_GET_SIZE(result) > total) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
587 if (_PyBytes_Resize(&result, total) < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
588 /* This should never happen, but just in case */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
589 Py_DECREF(result);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
590 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
591 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
592 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
593 return result;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
594 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
595
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
596 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
597 fileio_read(fileio *self, PyObject *args)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
598 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
599 char *ptr;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
600 Py_ssize_t n;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
601 Py_ssize_t size = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
602 PyObject *bytes;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
603
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
604 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
605 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
606 if (!self->readable)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
607 return err_mode("reading");
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
608
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
609 if (!PyArg_ParseTuple(args, "|O&", &_PyIO_ConvertSsize_t, &size))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
610 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
611
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
612 if (size < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
613 return fileio_readall(self);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
614 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
615
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
616 #if defined(MS_WIN64) || defined(MS_WINDOWS)
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
617 if (size > INT_MAX)
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
618 size = INT_MAX;
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
619 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
620 bytes = PyBytes_FromStringAndSize(NULL, size);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
621 if (bytes == NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
622 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
623 ptr = PyBytes_AS_STRING(bytes);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
624
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
625 if (_PyVerify_fd(self->fd)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
626 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
627 errno = 0;
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
628 #if defined(MS_WIN64) || defined(MS_WINDOWS)
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
629 n = read(self->fd, ptr, (int)size);
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
630 #else
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
631 n = read(self->fd, ptr, size);
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
632 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
633 Py_END_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
634 } else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
635 n = -1;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
636
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
637 if (n < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
638 Py_DECREF(bytes);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
639 if (errno == EAGAIN)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
640 Py_RETURN_NONE;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
641 PyErr_SetFromErrno(PyExc_IOError);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
642 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
643 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
644
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
645 if (n != size) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
646 if (_PyBytes_Resize(&bytes, n) < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
647 Py_DECREF(bytes);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
648 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
649 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
650 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
651
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
652 return (PyObject *) bytes;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
653 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
654
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
655 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
656 fileio_write(fileio *self, PyObject *args)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
657 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
658 Py_buffer pbuf;
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
659 Py_ssize_t n, len;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
660
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
661 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
662 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
663 if (!self->writable)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
664 return err_mode("writing");
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
665
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
666 if (!PyArg_ParseTuple(args, "s*", &pbuf))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
667 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
668
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
669 if (_PyVerify_fd(self->fd)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
670 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
671 errno = 0;
71223
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
672 len = pbuf.len;
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
673 #if defined(MS_WIN64) || defined(MS_WINDOWS)
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
674 if (len > INT_MAX)
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
675 len = INT_MAX;
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
676 n = write(self->fd, pbuf.buf, (int)len);
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
677 #else
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
678 n = write(self->fd, pbuf.buf, len);
6abbc5f68e20 Issue #9611, #9015: FileIO.read(), FileIO.readinto(), FileIO.write() and
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
679 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
680 Py_END_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
681 } else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
682 n = -1;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
683
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
684 PyBuffer_Release(&pbuf);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
685
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
686 if (n < 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
687 if (errno == EAGAIN)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
688 Py_RETURN_NONE;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
689 PyErr_SetFromErrno(PyExc_IOError);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
690 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
691 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
692
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
693 return PyLong_FromSsize_t(n);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
694 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
695
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
696 /* XXX Windows support below is likely incomplete */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
697
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
698 /* Cribbed from posix_lseek() */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
699 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
700 portable_lseek(int fd, PyObject *posobj, int whence)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
701 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
702 Py_off_t pos, res;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
703
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
704 #ifdef SEEK_SET
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
705 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
706 switch (whence) {
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
707 #if SEEK_SET != 0
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
708 case 0: whence = SEEK_SET; break;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
709 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
710 #if SEEK_CUR != 1
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
711 case 1: whence = SEEK_CUR; break;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
712 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
713 #if SEEK_END != 2
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
714 case 2: whence = SEEK_END; break;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
715 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
716 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
717 #endif /* SEEK_SET */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
718
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
719 if (posobj == NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
720 pos = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
721 else {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
722 if(PyFloat_Check(posobj)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
723 PyErr_SetString(PyExc_TypeError, "an integer is required");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
724 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
725 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
726 #if defined(HAVE_LARGEFILE_SUPPORT)
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
727 pos = PyLong_AsLongLong(posobj);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
728 #else
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
729 pos = PyLong_AsLong(posobj);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
730 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
731 if (PyErr_Occurred())
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
732 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
733 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
734
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
735 if (_PyVerify_fd(fd)) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
736 Py_BEGIN_ALLOW_THREADS
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
737 #if defined(MS_WIN64) || defined(MS_WINDOWS)
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
738 res = _lseeki64(fd, pos, whence);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
739 #else
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
740 res = lseek(fd, pos, whence);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
741 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
742 Py_END_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
743 } else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
744 res = -1;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
745 if (res < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
746 return PyErr_SetFromErrno(PyExc_IOError);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
747
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
748 #if defined(HAVE_LARGEFILE_SUPPORT)
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
749 return PyLong_FromLongLong(res);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
750 #else
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
751 return PyLong_FromLong(res);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
752 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
753 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
754
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
755 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
756 fileio_seek(fileio *self, PyObject *args)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
757 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
758 PyObject *posobj;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
759 int whence = 0;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
760
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
761 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
762 return err_closed();
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
763
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
764 if (!PyArg_ParseTuple(args, "O|i", &posobj, &whence))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
765 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
766
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
767 return portable_lseek(self->fd, posobj, whence);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
768 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
769
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
770 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
771 fileio_tell(fileio *self, PyObject *args)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
772 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
773 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
774 return err_closed();
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
775
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
776 return portable_lseek(self->fd, NULL, 1);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
777 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
778
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
779 #ifdef HAVE_FTRUNCATE
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
780 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
781 fileio_truncate(fileio *self, PyObject *args)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
782 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
783 PyObject *posobj = NULL; /* the new size wanted by the user */
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
784 #ifndef MS_WINDOWS
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
785 Py_off_t pos;
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
786 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
787 int ret;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
788 int fd;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
789
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
790 fd = self->fd;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
791 if (fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
792 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
793 if (!self->writable)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
794 return err_mode("writing");
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
795
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
796 if (!PyArg_ParseTuple(args, "|O", &posobj))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
797 return NULL;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
798
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
799 if (posobj == Py_None || posobj == NULL) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
800 /* Get the current position. */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
801 posobj = portable_lseek(fd, NULL, 1);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
802 if (posobj == NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
803 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
804 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
805 else {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
806 Py_INCREF(posobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
807 }
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
808
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
809 #ifdef MS_WINDOWS
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
810 /* MS _chsize doesn't work if newsize doesn't fit in 32 bits,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
811 so don't even try using it. */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
812 {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
813 PyObject *oldposobj, *tempposobj;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
814 HANDLE hFile;
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
815
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
816 /* we save the file pointer position */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
817 oldposobj = portable_lseek(fd, NULL, 1);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
818 if (oldposobj == NULL) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
819 Py_DECREF(posobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
820 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
821 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
822
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
823 /* we then move to the truncation position */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
824 tempposobj = portable_lseek(fd, posobj, 0);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
825 if (tempposobj == NULL) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
826 Py_DECREF(oldposobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
827 Py_DECREF(posobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
828 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
829 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
830 Py_DECREF(tempposobj);
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
831
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
832 /* Truncate. Note that this may grow the file! */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
833 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
834 errno = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
835 hFile = (HANDLE)_get_osfhandle(fd);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
836 ret = hFile == (HANDLE)-1; /* testing for INVALID_HANDLE value */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
837 if (ret == 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
838 ret = SetEndOfFile(hFile) == 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
839 if (ret)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
840 errno = EACCES;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
841 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
842 Py_END_ALLOW_THREADS
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
843
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
844 /* we restore the file pointer position in any case */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
845 tempposobj = portable_lseek(fd, oldposobj, 0);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
846 Py_DECREF(oldposobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
847 if (tempposobj == NULL) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
848 Py_DECREF(posobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
849 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
850 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
851 Py_DECREF(tempposobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
852 }
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
853 #else
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
854
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
855 #if defined(HAVE_LARGEFILE_SUPPORT)
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
856 pos = PyLong_AsLongLong(posobj);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
857 #else
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
858 pos = PyLong_AsLong(posobj);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
859 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
860 if (PyErr_Occurred()){
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
861 Py_DECREF(posobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
862 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
863 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
864
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
865 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
866 errno = 0;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
867 ret = ftruncate(fd, pos);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
868 Py_END_ALLOW_THREADS
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
869
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
870 #endif /* !MS_WINDOWS */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
871
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
872 if (ret != 0) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
873 Py_DECREF(posobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
874 PyErr_SetFromErrno(PyExc_IOError);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
875 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
876 }
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
877
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
878 return posobj;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
879 }
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
880 #endif /* HAVE_FTRUNCATE */
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
881
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
882 static char *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
883 mode_string(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
884 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
885 if (self->readable) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
886 if (self->writable)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
887 return "rb+";
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
888 else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
889 return "rb";
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
890 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
891 else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
892 return "wb";
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
893 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
894
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
895 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
896 fileio_repr(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
897 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
898 PyObject *nameobj, *res;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
899
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
900 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
901 return PyString_FromFormat("<_io.FileIO [closed]>");
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
902
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
903 nameobj = PyObject_GetAttrString((PyObject *) self, "name");
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
904 if (nameobj == NULL) {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
905 if (PyErr_ExceptionMatches(PyExc_AttributeError))
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
906 PyErr_Clear();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
907 else
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
908 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
909 res = PyString_FromFormat("<_io.FileIO fd=%d mode='%s'>",
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
910 self->fd, mode_string(self));
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
911 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
912 else {
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
913 PyObject *repr = PyObject_Repr(nameobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
914 Py_DECREF(nameobj);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
915 if (repr == NULL)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
916 return NULL;
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
917 res = PyString_FromFormat("<_io.FileIO name=%s mode='%s'>",
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
918 PyString_AS_STRING(repr),
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
919 mode_string(self));
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
920 Py_DECREF(repr);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
921 }
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
922 return res;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
923 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
924
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
925 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
926 fileio_isatty(fileio *self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
927 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
928 long res;
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
929
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
930 if (self->fd < 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
931 return err_closed();
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
932 Py_BEGIN_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
933 res = isatty(self->fd);
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
934 Py_END_ALLOW_THREADS
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
935 return PyBool_FromLong(res);
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
936 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
937
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
938
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
939 PyDoc_STRVAR(fileio_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
940 "file(name: str[, mode: str]) -> file IO object\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
941 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
942 "Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n"
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
943 "writing or appending. The file will be created if it doesn't exist\n"
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
944 "when opened for writing or appending; it will be truncated when\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
945 "opened for writing. Add a '+' to the mode to allow simultaneous\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
946 "reading and writing.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
947
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
948 PyDoc_STRVAR(read_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
949 "read(size: int) -> bytes. read at most size bytes, returned as bytes.\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
950 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
951 "Only makes one system call, so less data may be returned than requested\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
952 "In non-blocking mode, returns None if no data is available.\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
953 "On end-of-file, returns ''.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
954
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
955 PyDoc_STRVAR(readall_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
956 "readall() -> bytes. read all data from the file, returned as bytes.\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
957 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
958 "In non-blocking mode, returns as much as is immediately available,\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
959 "or None if no data is available. On end-of-file, returns ''.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
960
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
961 PyDoc_STRVAR(write_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
962 "write(b: bytes) -> int. Write bytes b to file, return number written.\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
963 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
964 "Only makes one system call, so not all of the data may be written.\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
965 "The number of bytes actually written is returned.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
966
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
967 PyDoc_STRVAR(fileno_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
968 "fileno() -> int. \"file descriptor\".\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
969 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
970 "This is needed for lower-level file interfaces, such the fcntl module.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
971
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
972 PyDoc_STRVAR(seek_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
973 "seek(offset: int[, whence: int]) -> None. Move to new file position.\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
974 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
975 "Argument offset is a byte count. Optional argument whence defaults to\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
976 "0 (offset from start of file, offset should be >= 0); other values are 1\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
977 "(move relative to current position, positive or negative), and 2 (move\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
978 "relative to end of file, usually negative, although many platforms allow\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
979 "seeking beyond the end of a file)."
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
980 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
981 "Note that not all file objects are seekable.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
982
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
983 #ifdef HAVE_FTRUNCATE
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
984 PyDoc_STRVAR(truncate_doc,
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
985 "truncate([size: int]) -> None. Truncate the file to at most size bytes.\n"
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
986 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
987 "Size defaults to the current file position, as returned by tell()."
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
988 "The current file position is changed to the value of size.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
989 #endif
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
990
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
991 PyDoc_STRVAR(tell_doc,
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
992 "tell() -> int. Current file position");
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
993
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
994 PyDoc_STRVAR(readinto_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
995 "readinto() -> Same as RawIOBase.readinto().");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
996
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
997 PyDoc_STRVAR(close_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
998 "close() -> None. Close the file.\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
999 "\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1000 "A closed file cannot be used for further I/O operations. close() may be\n"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1001 "called more than once without error. Changes the fileno to -1.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1002
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1003 PyDoc_STRVAR(isatty_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1004 "isatty() -> bool. True if the file is connected to a tty device.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1005
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1006 PyDoc_STRVAR(seekable_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1007 "seekable() -> bool. True if file supports random-access.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1008
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1009 PyDoc_STRVAR(readable_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1010 "readable() -> bool. True if file was opened in a read mode.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1011
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1012 PyDoc_STRVAR(writable_doc,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1013 "writable() -> bool. True if file was opened in a write mode.");
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1014
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1015 static PyMethodDef fileio_methods[] = {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1016 {"read", (PyCFunction)fileio_read, METH_VARARGS, read_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1017 {"readall", (PyCFunction)fileio_readall, METH_NOARGS, readall_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1018 {"readinto", (PyCFunction)fileio_readinto, METH_VARARGS, readinto_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1019 {"write", (PyCFunction)fileio_write, METH_VARARGS, write_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1020 {"seek", (PyCFunction)fileio_seek, METH_VARARGS, seek_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1021 {"tell", (PyCFunction)fileio_tell, METH_VARARGS, tell_doc},
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1022 #ifdef HAVE_FTRUNCATE
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1023 {"truncate", (PyCFunction)fileio_truncate, METH_VARARGS, truncate_doc},
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1024 #endif
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1025 {"close", (PyCFunction)fileio_close, METH_NOARGS, close_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1026 {"seekable", (PyCFunction)fileio_seekable, METH_NOARGS, seekable_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1027 {"readable", (PyCFunction)fileio_readable, METH_NOARGS, readable_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1028 {"writable", (PyCFunction)fileio_writable, METH_NOARGS, writable_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1029 {"fileno", (PyCFunction)fileio_fileno, METH_NOARGS, fileno_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1030 {"isatty", (PyCFunction)fileio_isatty, METH_NOARGS, isatty_doc},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1031 {NULL, NULL} /* sentinel */
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1032 };
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1033
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1034 /* 'closed' and 'mode' are attributes for backwards compatibility reasons. */
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1035
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1036 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1037 get_closed(fileio *self, void *closure)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1038 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1039 return PyBool_FromLong((long)(self->fd < 0));
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1040 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1041
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1042 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1043 get_closefd(fileio *self, void *closure)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1044 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1045 return PyBool_FromLong((long)(self->closefd));
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1046 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1047
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1048 static PyObject *
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1049 get_mode(fileio *self, void *closure)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1050 {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1051 return PyUnicode_FromString(mode_string(self));
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1052 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1053
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1054 static PyGetSetDef fileio_getsetlist[] = {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1055 {"closed", (getter)get_closed, NULL, "True if the file is closed"},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1056 {"closefd", (getter)get_closefd, NULL,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1057 "True if the file descriptor will be closed"},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1058 {"mode", (getter)get_mode, NULL, "String giving the file mode"},
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1059 {NULL},
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1060 };
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1061
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1062 PyTypeObject PyFileIO_Type = {
61250
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1063 PyVarObject_HEAD_INIT(NULL, 0)
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1064 "_io.FileIO",
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1065 sizeof(fileio),
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1066 0,
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1067 (destructor)fileio_dealloc, /* tp_dealloc */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1068 0, /* tp_print */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1069 0, /* tp_getattr */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1070 0, /* tp_setattr */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1071 0, /* tp_reserved */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1072 (reprfunc)fileio_repr, /* tp_repr */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1073 0, /* tp_as_number */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1074 0, /* tp_as_sequence */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1075 0, /* tp_as_mapping */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1076 0, /* tp_hash */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1077 0, /* tp_call */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1078 0, /* tp_str */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1079 PyObject_GenericGetAttr, /* tp_getattro */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1080 0, /* tp_setattro */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1081 0, /* tp_as_buffer */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1082 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1083 | Py_TPFLAGS_HAVE_GC, /* tp_flags */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1084 fileio_doc, /* tp_doc */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1085 (traverseproc)fileio_traverse, /* tp_traverse */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1086 (inquiry)fileio_clear, /* tp_clear */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1087 0, /* tp_richcompare */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1088 offsetof(fileio, weakreflist), /* tp_weaklistoffset */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1089 0, /* tp_iter */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1090 0, /* tp_iternext */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1091 fileio_methods, /* tp_methods */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1092 0, /* tp_members */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1093 fileio_getsetlist, /* tp_getset */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1094 0, /* tp_base */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1095 0, /* tp_dict */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1096 0, /* tp_descr_get */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1097 0, /* tp_descr_set */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1098 offsetof(fileio, dict), /* tp_dictoffset */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1099 fileio_init, /* tp_init */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1100 PyType_GenericAlloc, /* tp_alloc */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1101 fileio_new, /* tp_new */
d4aa35907808 Untabify Modules/_io/fileio.c
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
1102 PyObject_GC_Del, /* tp_free */
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1103 };