Mercurial > cpython-lru_cache-weakref
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 |
| 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 }; |
