blob: 7ce3b63306c39b5c3a6ad52ab46d813a61b03848 [file] [log] [blame]
Victor Stinner4e314432010-10-07 21:45:39 +00001#include "Python.h"
Stefan Krah6df5cae2012-11-12 20:14:36 +01002#include "osdefs.h"
Stefan Krah6c01e382014-01-20 15:31:08 +01003#include <locale.h>
4
Victor Stinnerb306d752010-10-07 22:09:40 +00005#ifdef MS_WINDOWS
Steve Dowerd81431f2015-03-06 14:47:02 -08006# include <malloc.h>
Victor Stinnerb306d752010-10-07 22:09:40 +00007# include <windows.h>
Steve Dower8fc89802015-04-12 00:26:27 -04008extern int winerror_to_errno(int);
Victor Stinnerb306d752010-10-07 22:09:40 +00009#endif
Victor Stinner4e314432010-10-07 21:45:39 +000010
Brett Cannonefb00c02012-02-29 18:31:31 -050011#ifdef HAVE_LANGINFO_H
12#include <langinfo.h>
13#endif
14
Victor Stinnerdaf45552013-08-28 00:53:59 +020015#ifdef HAVE_SYS_IOCTL_H
16#include <sys/ioctl.h>
17#endif
18
19#ifdef HAVE_FCNTL_H
20#include <fcntl.h>
21#endif /* HAVE_FCNTL_H */
22
Victor Stinnere2623772012-11-12 23:04:02 +010023#ifdef __APPLE__
24extern wchar_t* _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size);
25#endif
26
Victor Stinnerdaf45552013-08-28 00:53:59 +020027#ifdef O_CLOEXEC
Victor Stinnerb034eee2013-09-07 10:36:04 +020028/* Does open() support the O_CLOEXEC flag? Possible values:
Victor Stinnerdaf45552013-08-28 00:53:59 +020029
30 -1: unknown
31 0: open() ignores O_CLOEXEC flag, ex: Linux kernel older than 2.6.23
32 1: open() supports O_CLOEXEC flag, close-on-exec is set
33
Victor Stinnera555cfc2015-03-18 00:22:14 +010034 The flag is used by _Py_open(), _Py_open_noraise(), io.FileIO
35 and os.open(). */
Victor Stinnerdaf45552013-08-28 00:53:59 +020036int _Py_open_cloexec_works = -1;
37#endif
38
Brett Cannonefb00c02012-02-29 18:31:31 -050039PyObject *
40_Py_device_encoding(int fd)
41{
Victor Stinner14b9b112013-06-25 00:37:25 +020042#if defined(MS_WINDOWS)
Brett Cannonefb00c02012-02-29 18:31:31 -050043 UINT cp;
44#endif
Steve Dower8fc89802015-04-12 00:26:27 -040045 int valid;
46 _Py_BEGIN_SUPPRESS_IPH
Steve Dower940f33a2016-09-08 11:21:54 -070047 valid = isatty(fd);
Steve Dower8fc89802015-04-12 00:26:27 -040048 _Py_END_SUPPRESS_IPH
49 if (!valid)
Brett Cannonefb00c02012-02-29 18:31:31 -050050 Py_RETURN_NONE;
Steve Dower8fc89802015-04-12 00:26:27 -040051
Victor Stinner14b9b112013-06-25 00:37:25 +020052#if defined(MS_WINDOWS)
Brett Cannonefb00c02012-02-29 18:31:31 -050053 if (fd == 0)
54 cp = GetConsoleCP();
55 else if (fd == 1 || fd == 2)
56 cp = GetConsoleOutputCP();
57 else
58 cp = 0;
59 /* GetConsoleCP() and GetConsoleOutputCP() return 0 if the application
60 has no console */
61 if (cp != 0)
62 return PyUnicode_FromFormat("cp%u", (unsigned int)cp);
63#elif defined(CODESET)
64 {
65 char *codeset = nl_langinfo(CODESET);
66 if (codeset != NULL && codeset[0] != 0)
67 return PyUnicode_FromString(codeset);
68 }
69#endif
70 Py_RETURN_NONE;
71}
72
Victor Stinnerd45c7f82012-12-04 01:34:47 +010073#if !defined(__APPLE__) && !defined(MS_WINDOWS)
74extern int _Py_normalize_encoding(const char *, char *, size_t);
75
76/* Workaround FreeBSD and OpenIndiana locale encoding issue with the C locale.
77 On these operating systems, nl_langinfo(CODESET) announces an alias of the
78 ASCII encoding, whereas mbstowcs() and wcstombs() functions use the
79 ISO-8859-1 encoding. The problem is that os.fsencode() and os.fsdecode() use
80 locale.getpreferredencoding() codec. For example, if command line arguments
81 are decoded by mbstowcs() and encoded back by os.fsencode(), we get a
82 UnicodeEncodeError instead of retrieving the original byte string.
83
84 The workaround is enabled if setlocale(LC_CTYPE, NULL) returns "C",
85 nl_langinfo(CODESET) announces "ascii" (or an alias to ASCII), and at least
86 one byte in range 0x80-0xff can be decoded from the locale encoding. The
87 workaround is also enabled on error, for example if getting the locale
88 failed.
89
Philip Jenvey215c49a2013-01-15 13:24:12 -080090 Values of force_ascii:
Victor Stinnerd45c7f82012-12-04 01:34:47 +010091
Victor Stinnerf6a271a2014-08-01 12:28:48 +020092 1: the workaround is used: Py_EncodeLocale() uses
93 encode_ascii_surrogateescape() and Py_DecodeLocale() uses
Victor Stinnerd45c7f82012-12-04 01:34:47 +010094 decode_ascii_surrogateescape()
Victor Stinnerf6a271a2014-08-01 12:28:48 +020095 0: the workaround is not used: Py_EncodeLocale() uses wcstombs() and
96 Py_DecodeLocale() uses mbstowcs()
Victor Stinnerd45c7f82012-12-04 01:34:47 +010097 -1: unknown, need to call check_force_ascii() to get the value
98*/
99static int force_ascii = -1;
100
101static int
102check_force_ascii(void)
103{
104 char *loc;
105#if defined(HAVE_LANGINFO_H) && defined(CODESET)
106 char *codeset, **alias;
107 char encoding[100];
108 int is_ascii;
109 unsigned int i;
110 char* ascii_aliases[] = {
111 "ascii",
112 "646",
113 "ansi-x3.4-1968",
114 "ansi-x3-4-1968",
115 "ansi-x3.4-1986",
116 "cp367",
117 "csascii",
118 "ibm367",
119 "iso646-us",
120 "iso-646.irv-1991",
121 "iso-ir-6",
122 "us",
123 "us-ascii",
124 NULL
125 };
126#endif
127
128 loc = setlocale(LC_CTYPE, NULL);
129 if (loc == NULL)
130 goto error;
131 if (strcmp(loc, "C") != 0) {
132 /* the LC_CTYPE locale is different than C */
133 return 0;
134 }
135
136#if defined(HAVE_LANGINFO_H) && defined(CODESET)
137 codeset = nl_langinfo(CODESET);
138 if (!codeset || codeset[0] == '\0') {
139 /* CODESET is not set or empty */
140 goto error;
141 }
142 if (!_Py_normalize_encoding(codeset, encoding, sizeof(encoding)))
143 goto error;
144
145 is_ascii = 0;
146 for (alias=ascii_aliases; *alias != NULL; alias++) {
147 if (strcmp(encoding, *alias) == 0) {
148 is_ascii = 1;
149 break;
150 }
151 }
152 if (!is_ascii) {
153 /* nl_langinfo(CODESET) is not "ascii" or an alias of ASCII */
154 return 0;
155 }
156
157 for (i=0x80; i<0xff; i++) {
158 unsigned char ch;
159 wchar_t wch;
160 size_t res;
161
162 ch = (unsigned char)i;
163 res = mbstowcs(&wch, (char*)&ch, 1);
164 if (res != (size_t)-1) {
165 /* decoding a non-ASCII character from the locale encoding succeed:
166 the locale encoding is not ASCII, force ASCII */
167 return 1;
168 }
169 }
170 /* None of the bytes in the range 0x80-0xff can be decoded from the locale
171 encoding: the locale encoding is really ASCII */
172 return 0;
173#else
174 /* nl_langinfo(CODESET) is not available: always force ASCII */
175 return 1;
176#endif
177
178error:
Martin Panter46f50722016-05-26 05:35:26 +0000179 /* if an error occurred, force the ASCII encoding */
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100180 return 1;
181}
182
183static char*
184encode_ascii_surrogateescape(const wchar_t *text, size_t *error_pos)
185{
186 char *result = NULL, *out;
187 size_t len, i;
188 wchar_t ch;
189
190 if (error_pos != NULL)
191 *error_pos = (size_t)-1;
192
193 len = wcslen(text);
194
195 result = PyMem_Malloc(len + 1); /* +1 for NUL byte */
196 if (result == NULL)
197 return NULL;
198
199 out = result;
200 for (i=0; i<len; i++) {
201 ch = text[i];
202
203 if (ch <= 0x7f) {
204 /* ASCII character */
205 *out++ = (char)ch;
206 }
207 else if (0xdc80 <= ch && ch <= 0xdcff) {
208 /* UTF-8b surrogate */
209 *out++ = (char)(ch - 0xdc00);
210 }
211 else {
212 if (error_pos != NULL)
213 *error_pos = i;
214 PyMem_Free(result);
215 return NULL;
216 }
217 }
218 *out = '\0';
219 return result;
220}
221#endif /* !defined(__APPLE__) && !defined(MS_WINDOWS) */
222
223#if !defined(__APPLE__) && (!defined(MS_WINDOWS) || !defined(HAVE_MBRTOWC))
224static wchar_t*
225decode_ascii_surrogateescape(const char *arg, size_t *size)
226{
227 wchar_t *res;
228 unsigned char *in;
229 wchar_t *out;
Benjamin Petersonf18bf6f2015-01-04 16:03:17 -0600230 size_t argsize = strlen(arg) + 1;
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100231
Benjamin Petersonf18bf6f2015-01-04 16:03:17 -0600232 if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t))
233 return NULL;
Benjamin Peterson10ecaa22015-01-04 16:05:39 -0600234 res = PyMem_RawMalloc(argsize*sizeof(wchar_t));
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100235 if (!res)
236 return NULL;
237
238 in = (unsigned char*)arg;
239 out = res;
240 while(*in)
241 if(*in < 128)
242 *out++ = *in++;
243 else
244 *out++ = 0xdc00 + *in++;
245 *out = 0;
246 if (size != NULL)
247 *size = out - res;
248 return res;
249}
250#endif
251
Victor Stinner4e314432010-10-07 21:45:39 +0000252
253/* Decode a byte string from the locale encoding with the
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200254 surrogateescape error handler: undecodable bytes are decoded as characters
255 in range U+DC80..U+DCFF. If a byte sequence can be decoded as a surrogate
Victor Stinner4e314432010-10-07 21:45:39 +0000256 character, escape the bytes using the surrogateescape error handler instead
257 of decoding them.
258
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200259 Return a pointer to a newly allocated wide character string, use
260 PyMem_RawFree() to free the memory. If size is not NULL, write the number of
261 wide characters excluding the null character into *size
Victor Stinner4e314432010-10-07 21:45:39 +0000262
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200263 Return NULL on decoding error or memory allocation error. If *size* is not
264 NULL, *size is set to (size_t)-1 on memory error or set to (size_t)-2 on
265 decoding error.
Victor Stinner19de4c32010-11-08 23:30:46 +0000266
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200267 Decoding errors should never happen, unless there is a bug in the C
268 library.
269
270 Use the Py_EncodeLocale() function to encode the character string back to a
271 byte string. */
Victor Stinner4e314432010-10-07 21:45:39 +0000272wchar_t*
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200273Py_DecodeLocale(const char* arg, size_t *size)
Victor Stinner4e314432010-10-07 21:45:39 +0000274{
Victor Stinnere2623772012-11-12 23:04:02 +0100275#ifdef __APPLE__
276 wchar_t *wstr;
277 wstr = _Py_DecodeUTF8_surrogateescape(arg, strlen(arg));
Victor Stinner0d92c4f2012-11-12 23:32:21 +0100278 if (size != NULL) {
279 if (wstr != NULL)
280 *size = wcslen(wstr);
281 else
282 *size = (size_t)-1;
283 }
Victor Stinnere2623772012-11-12 23:04:02 +0100284 return wstr;
285#else
Victor Stinner4e314432010-10-07 21:45:39 +0000286 wchar_t *res;
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100287 size_t argsize;
Victor Stinner4e314432010-10-07 21:45:39 +0000288 size_t count;
Victor Stinner313f10c2013-05-07 23:48:56 +0200289#ifdef HAVE_MBRTOWC
Victor Stinner4e314432010-10-07 21:45:39 +0000290 unsigned char *in;
291 wchar_t *out;
Victor Stinner4e314432010-10-07 21:45:39 +0000292 mbstate_t mbs;
293#endif
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100294
295#ifndef MS_WINDOWS
296 if (force_ascii == -1)
297 force_ascii = check_force_ascii();
298
299 if (force_ascii) {
300 /* force ASCII encoding to workaround mbstowcs() issue */
301 res = decode_ascii_surrogateescape(arg, size);
302 if (res == NULL)
303 goto oom;
304 return res;
305 }
306#endif
307
308#ifdef HAVE_BROKEN_MBSTOWCS
309 /* Some platforms have a broken implementation of
310 * mbstowcs which does not count the characters that
311 * would result from conversion. Use an upper bound.
312 */
313 argsize = strlen(arg);
314#else
315 argsize = mbstowcs(NULL, arg, 0);
316#endif
Victor Stinner4e314432010-10-07 21:45:39 +0000317 if (argsize != (size_t)-1) {
Benjamin Petersonf18bf6f2015-01-04 16:03:17 -0600318 if (argsize == PY_SSIZE_T_MAX)
319 goto oom;
320 argsize += 1;
321 if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t))
322 goto oom;
Benjamin Peterson10ecaa22015-01-04 16:05:39 -0600323 res = (wchar_t *)PyMem_RawMalloc(argsize*sizeof(wchar_t));
Victor Stinner4e314432010-10-07 21:45:39 +0000324 if (!res)
325 goto oom;
Benjamin Petersonf18bf6f2015-01-04 16:03:17 -0600326 count = mbstowcs(res, arg, argsize);
Victor Stinner4e314432010-10-07 21:45:39 +0000327 if (count != (size_t)-1) {
328 wchar_t *tmp;
329 /* Only use the result if it contains no
330 surrogate characters. */
331 for (tmp = res; *tmp != 0 &&
Victor Stinner76df43d2012-10-30 01:42:39 +0100332 !Py_UNICODE_IS_SURROGATE(*tmp); tmp++)
Victor Stinner4e314432010-10-07 21:45:39 +0000333 ;
Victor Stinner168e1172010-10-16 23:16:16 +0000334 if (*tmp == 0) {
335 if (size != NULL)
336 *size = count;
Victor Stinner4e314432010-10-07 21:45:39 +0000337 return res;
Victor Stinner168e1172010-10-16 23:16:16 +0000338 }
Victor Stinner4e314432010-10-07 21:45:39 +0000339 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200340 PyMem_RawFree(res);
Victor Stinner4e314432010-10-07 21:45:39 +0000341 }
342 /* Conversion failed. Fall back to escaping with surrogateescape. */
343#ifdef HAVE_MBRTOWC
344 /* Try conversion with mbrtwoc (C99), and escape non-decodable bytes. */
345
346 /* Overallocate; as multi-byte characters are in the argument, the
347 actual output could use less memory. */
348 argsize = strlen(arg) + 1;
Benjamin Petersonf18bf6f2015-01-04 16:03:17 -0600349 if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t))
350 goto oom;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200351 res = (wchar_t*)PyMem_RawMalloc(argsize*sizeof(wchar_t));
Victor Stinner19de4c32010-11-08 23:30:46 +0000352 if (!res)
353 goto oom;
Victor Stinner4e314432010-10-07 21:45:39 +0000354 in = (unsigned char*)arg;
355 out = res;
356 memset(&mbs, 0, sizeof mbs);
357 while (argsize) {
358 size_t converted = mbrtowc(out, (char*)in, argsize, &mbs);
359 if (converted == 0)
360 /* Reached end of string; null char stored. */
361 break;
362 if (converted == (size_t)-2) {
363 /* Incomplete character. This should never happen,
364 since we provide everything that we have -
365 unless there is a bug in the C library, or I
366 misunderstood how mbrtowc works. */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200367 PyMem_RawFree(res);
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100368 if (size != NULL)
369 *size = (size_t)-2;
Victor Stinner4e314432010-10-07 21:45:39 +0000370 return NULL;
371 }
372 if (converted == (size_t)-1) {
373 /* Conversion error. Escape as UTF-8b, and start over
374 in the initial shift state. */
375 *out++ = 0xdc00 + *in++;
376 argsize--;
377 memset(&mbs, 0, sizeof mbs);
378 continue;
379 }
Victor Stinner76df43d2012-10-30 01:42:39 +0100380 if (Py_UNICODE_IS_SURROGATE(*out)) {
Victor Stinner4e314432010-10-07 21:45:39 +0000381 /* Surrogate character. Escape the original
382 byte sequence with surrogateescape. */
383 argsize -= converted;
384 while (converted--)
385 *out++ = 0xdc00 + *in++;
386 continue;
387 }
388 /* successfully converted some bytes */
389 in += converted;
390 argsize -= converted;
391 out++;
392 }
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100393 if (size != NULL)
394 *size = out - res;
Victor Stinnere2623772012-11-12 23:04:02 +0100395#else /* HAVE_MBRTOWC */
Victor Stinner4e314432010-10-07 21:45:39 +0000396 /* Cannot use C locale for escaping; manually escape as if charset
397 is ASCII (i.e. escape all bytes > 128. This will still roundtrip
398 correctly in the locale's charset, which must be an ASCII superset. */
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100399 res = decode_ascii_surrogateescape(arg, size);
400 if (res == NULL)
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100401 goto oom;
Victor Stinnere2623772012-11-12 23:04:02 +0100402#endif /* HAVE_MBRTOWC */
Victor Stinner4e314432010-10-07 21:45:39 +0000403 return res;
404oom:
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100405 if (size != NULL)
406 *size = (size_t)-1;
Victor Stinner4e314432010-10-07 21:45:39 +0000407 return NULL;
Victor Stinnere2623772012-11-12 23:04:02 +0100408#endif /* __APPLE__ */
Victor Stinner4e314432010-10-07 21:45:39 +0000409}
410
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200411/* Encode a wide character string to the locale encoding with the
412 surrogateescape error handler: surrogate characters in the range
413 U+DC80..U+DCFF are converted to bytes 0x80..0xFF.
Victor Stinner4e314432010-10-07 21:45:39 +0000414
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200415 Return a pointer to a newly allocated byte string, use PyMem_Free() to free
416 the memory. Return NULL on encoding or memory allocation error.
Victor Stinner4e314432010-10-07 21:45:39 +0000417
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200418 If error_pos is not NULL, *error_pos is set to the index of the invalid
419 character on encoding error, or set to (size_t)-1 otherwise.
Victor Stinner2f02a512010-11-08 22:43:46 +0000420
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200421 Use the Py_DecodeLocale() function to decode the bytes string back to a wide
422 character string. */
Victor Stinner4e314432010-10-07 21:45:39 +0000423char*
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200424Py_EncodeLocale(const wchar_t *text, size_t *error_pos)
Victor Stinner4e314432010-10-07 21:45:39 +0000425{
Victor Stinnere2623772012-11-12 23:04:02 +0100426#ifdef __APPLE__
427 Py_ssize_t len;
428 PyObject *unicode, *bytes = NULL;
429 char *cpath;
430
431 unicode = PyUnicode_FromWideChar(text, wcslen(text));
Victor Stinner0d92c4f2012-11-12 23:32:21 +0100432 if (unicode == NULL)
Victor Stinnere2623772012-11-12 23:04:02 +0100433 return NULL;
Victor Stinnere2623772012-11-12 23:04:02 +0100434
435 bytes = _PyUnicode_AsUTF8String(unicode, "surrogateescape");
436 Py_DECREF(unicode);
437 if (bytes == NULL) {
438 PyErr_Clear();
Victor Stinner0d92c4f2012-11-12 23:32:21 +0100439 if (error_pos != NULL)
440 *error_pos = (size_t)-1;
Victor Stinnere2623772012-11-12 23:04:02 +0100441 return NULL;
442 }
443
444 len = PyBytes_GET_SIZE(bytes);
445 cpath = PyMem_Malloc(len+1);
446 if (cpath == NULL) {
Victor Stinner0d92c4f2012-11-12 23:32:21 +0100447 PyErr_Clear();
Victor Stinnere2623772012-11-12 23:04:02 +0100448 Py_DECREF(bytes);
Victor Stinner0d92c4f2012-11-12 23:32:21 +0100449 if (error_pos != NULL)
450 *error_pos = (size_t)-1;
Victor Stinnere2623772012-11-12 23:04:02 +0100451 return NULL;
452 }
453 memcpy(cpath, PyBytes_AsString(bytes), len + 1);
454 Py_DECREF(bytes);
455 return cpath;
456#else /* __APPLE__ */
Victor Stinner4e314432010-10-07 21:45:39 +0000457 const size_t len = wcslen(text);
458 char *result = NULL, *bytes = NULL;
459 size_t i, size, converted;
460 wchar_t c, buf[2];
461
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100462#ifndef MS_WINDOWS
463 if (force_ascii == -1)
464 force_ascii = check_force_ascii();
465
466 if (force_ascii)
467 return encode_ascii_surrogateescape(text, error_pos);
468#endif
469
Victor Stinner4e314432010-10-07 21:45:39 +0000470 /* The function works in two steps:
471 1. compute the length of the output buffer in bytes (size)
472 2. outputs the bytes */
473 size = 0;
474 buf[1] = 0;
475 while (1) {
476 for (i=0; i < len; i++) {
477 c = text[i];
478 if (c >= 0xdc80 && c <= 0xdcff) {
479 /* UTF-8b surrogate */
480 if (bytes != NULL) {
481 *bytes++ = c - 0xdc00;
482 size--;
483 }
484 else
485 size++;
486 continue;
487 }
488 else {
489 buf[0] = c;
490 if (bytes != NULL)
491 converted = wcstombs(bytes, buf, size);
492 else
493 converted = wcstombs(NULL, buf, 0);
494 if (converted == (size_t)-1) {
495 if (result != NULL)
496 PyMem_Free(result);
Victor Stinner2f02a512010-11-08 22:43:46 +0000497 if (error_pos != NULL)
498 *error_pos = i;
Victor Stinner4e314432010-10-07 21:45:39 +0000499 return NULL;
500 }
501 if (bytes != NULL) {
502 bytes += converted;
503 size -= converted;
504 }
505 else
506 size += converted;
507 }
508 }
509 if (result != NULL) {
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100510 *bytes = '\0';
Victor Stinner4e314432010-10-07 21:45:39 +0000511 break;
512 }
513
514 size += 1; /* nul byte at the end */
515 result = PyMem_Malloc(size);
Victor Stinner0d92c4f2012-11-12 23:32:21 +0100516 if (result == NULL) {
517 if (error_pos != NULL)
518 *error_pos = (size_t)-1;
Victor Stinner4e314432010-10-07 21:45:39 +0000519 return NULL;
Victor Stinner0d92c4f2012-11-12 23:32:21 +0100520 }
Victor Stinner4e314432010-10-07 21:45:39 +0000521 bytes = result;
522 }
523 return result;
Victor Stinnere2623772012-11-12 23:04:02 +0100524#endif /* __APPLE__ */
Victor Stinner4e314432010-10-07 21:45:39 +0000525}
526
Victor Stinner6672d0c2010-10-07 22:53:43 +0000527
Steve Dowerf2f373f2015-02-21 08:44:05 -0800528#ifdef MS_WINDOWS
529static __int64 secs_between_epochs = 11644473600; /* Seconds between 1.1.1601 and 1.1.1970 */
530
531static void
532FILE_TIME_to_time_t_nsec(FILETIME *in_ptr, time_t *time_out, int* nsec_out)
533{
534 /* XXX endianness. Shouldn't matter, as all Windows implementations are little-endian */
535 /* Cannot simply cast and dereference in_ptr,
536 since it might not be aligned properly */
537 __int64 in;
538 memcpy(&in, in_ptr, sizeof(in));
539 *nsec_out = (int)(in % 10000000) * 100; /* FILETIME is in units of 100 nsec. */
540 *time_out = Py_SAFE_DOWNCAST((in / 10000000) - secs_between_epochs, __int64, time_t);
541}
542
543void
Steve Dowerbf1f3762015-02-21 15:26:02 -0800544_Py_time_t_to_FILE_TIME(time_t time_in, int nsec_in, FILETIME *out_ptr)
Steve Dowerf2f373f2015-02-21 08:44:05 -0800545{
546 /* XXX endianness */
547 __int64 out;
548 out = time_in + secs_between_epochs;
549 out = out * 10000000 + nsec_in / 100;
550 memcpy(out_ptr, &out, sizeof(out));
551}
552
553/* Below, we *know* that ugo+r is 0444 */
554#if _S_IREAD != 0400
555#error Unsupported C library
556#endif
557static int
558attributes_to_mode(DWORD attr)
559{
560 int m = 0;
561 if (attr & FILE_ATTRIBUTE_DIRECTORY)
562 m |= _S_IFDIR | 0111; /* IFEXEC for user,group,other */
563 else
564 m |= _S_IFREG;
565 if (attr & FILE_ATTRIBUTE_READONLY)
566 m |= 0444;
567 else
568 m |= 0666;
569 return m;
570}
571
Steve Dowerbf1f3762015-02-21 15:26:02 -0800572void
Victor Stinnere134a7f2015-03-30 10:09:31 +0200573_Py_attribute_data_to_stat(BY_HANDLE_FILE_INFORMATION *info, ULONG reparse_tag,
574 struct _Py_stat_struct *result)
Steve Dowerf2f373f2015-02-21 08:44:05 -0800575{
576 memset(result, 0, sizeof(*result));
577 result->st_mode = attributes_to_mode(info->dwFileAttributes);
578 result->st_size = (((__int64)info->nFileSizeHigh)<<32) + info->nFileSizeLow;
579 result->st_dev = info->dwVolumeSerialNumber;
580 result->st_rdev = result->st_dev;
581 FILE_TIME_to_time_t_nsec(&info->ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
582 FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
583 FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
584 result->st_nlink = info->nNumberOfLinks;
585 result->st_ino = (((__int64)info->nFileIndexHigh)<<32) + info->nFileIndexLow;
586 if (reparse_tag == IO_REPARSE_TAG_SYMLINK) {
587 /* first clear the S_IFMT bits */
588 result->st_mode ^= (result->st_mode & S_IFMT);
589 /* now set the bits that make this a symlink */
590 result->st_mode |= S_IFLNK;
591 }
592 result->st_file_attributes = info->dwFileAttributes;
Steve Dowerf2f373f2015-02-21 08:44:05 -0800593}
594#endif
595
596/* Return information about a file.
597
598 On POSIX, use fstat().
599
600 On Windows, use GetFileType() and GetFileInformationByHandle() which support
601 files larger than 2 GB. fstat() may fail with EOVERFLOW on files larger
Martin Panter6f9b0102015-12-17 10:18:28 +0000602 than 2 GB because the file size type is a signed 32-bit integer: see issue
Steve Dowerf2f373f2015-02-21 08:44:05 -0800603 #23152.
Victor Stinnere134a7f2015-03-30 10:09:31 +0200604
605 On Windows, set the last Windows error and return nonzero on error. On
606 POSIX, set errno and return nonzero on error. Fill status and return 0 on
607 success. */
Steve Dowerf2f373f2015-02-21 08:44:05 -0800608int
Victor Stinnere134a7f2015-03-30 10:09:31 +0200609_Py_fstat_noraise(int fd, struct _Py_stat_struct *status)
Steve Dowerf2f373f2015-02-21 08:44:05 -0800610{
611#ifdef MS_WINDOWS
612 BY_HANDLE_FILE_INFORMATION info;
613 HANDLE h;
614 int type;
615
Steve Dower940f33a2016-09-08 11:21:54 -0700616 _Py_BEGIN_SUPPRESS_IPH
617 h = (HANDLE)_get_osfhandle(fd);
618 _Py_END_SUPPRESS_IPH
Steve Dowerf2f373f2015-02-21 08:44:05 -0800619
620 if (h == INVALID_HANDLE_VALUE) {
Steve Dower8fc89802015-04-12 00:26:27 -0400621 /* errno is already set by _get_osfhandle, but we also set
622 the Win32 error for callers who expect that */
Steve Dower8acde7d2015-03-07 18:14:07 -0800623 SetLastError(ERROR_INVALID_HANDLE);
Steve Dowerf2f373f2015-02-21 08:44:05 -0800624 return -1;
625 }
Victor Stinnere134a7f2015-03-30 10:09:31 +0200626 memset(status, 0, sizeof(*status));
Steve Dowerf2f373f2015-02-21 08:44:05 -0800627
628 type = GetFileType(h);
629 if (type == FILE_TYPE_UNKNOWN) {
630 DWORD error = GetLastError();
Steve Dower8fc89802015-04-12 00:26:27 -0400631 if (error != 0) {
632 errno = winerror_to_errno(error);
Steve Dowerf2f373f2015-02-21 08:44:05 -0800633 return -1;
Steve Dower8fc89802015-04-12 00:26:27 -0400634 }
Steve Dowerf2f373f2015-02-21 08:44:05 -0800635 /* else: valid but unknown file */
636 }
637
638 if (type != FILE_TYPE_DISK) {
639 if (type == FILE_TYPE_CHAR)
Victor Stinnere134a7f2015-03-30 10:09:31 +0200640 status->st_mode = _S_IFCHR;
Steve Dowerf2f373f2015-02-21 08:44:05 -0800641 else if (type == FILE_TYPE_PIPE)
Victor Stinnere134a7f2015-03-30 10:09:31 +0200642 status->st_mode = _S_IFIFO;
Steve Dowerf2f373f2015-02-21 08:44:05 -0800643 return 0;
644 }
645
646 if (!GetFileInformationByHandle(h, &info)) {
Steve Dower8fc89802015-04-12 00:26:27 -0400647 /* The Win32 error is already set, but we also set errno for
648 callers who expect it */
649 errno = winerror_to_errno(GetLastError());
Steve Dowerf2f373f2015-02-21 08:44:05 -0800650 return -1;
651 }
652
Victor Stinnere134a7f2015-03-30 10:09:31 +0200653 _Py_attribute_data_to_stat(&info, 0, status);
Steve Dowerf2f373f2015-02-21 08:44:05 -0800654 /* specific to fstat() */
Victor Stinnere134a7f2015-03-30 10:09:31 +0200655 status->st_ino = (((__int64)info.nFileIndexHigh)<<32) + info.nFileIndexLow;
Steve Dowerf2f373f2015-02-21 08:44:05 -0800656 return 0;
657#else
Victor Stinnere134a7f2015-03-30 10:09:31 +0200658 return fstat(fd, status);
Steve Dowerf2f373f2015-02-21 08:44:05 -0800659#endif
660}
Steve Dowerf2f373f2015-02-21 08:44:05 -0800661
Victor Stinnere134a7f2015-03-30 10:09:31 +0200662/* Return information about a file.
663
664 On POSIX, use fstat().
665
666 On Windows, use GetFileType() and GetFileInformationByHandle() which support
667 files larger than 2 GB. fstat() may fail with EOVERFLOW on files larger
Martin Panter6f9b0102015-12-17 10:18:28 +0000668 than 2 GB because the file size type is a signed 32-bit integer: see issue
Victor Stinnere134a7f2015-03-30 10:09:31 +0200669 #23152.
670
671 Raise an exception and return -1 on error. On Windows, set the last Windows
672 error on error. On POSIX, set errno on error. Fill status and return 0 on
673 success.
674
Victor Stinner6f4fae82015-04-01 18:34:32 +0200675 Release the GIL to call GetFileType() and GetFileInformationByHandle(), or
676 to call fstat(). The caller must hold the GIL. */
Victor Stinnere134a7f2015-03-30 10:09:31 +0200677int
678_Py_fstat(int fd, struct _Py_stat_struct *status)
679{
680 int res;
681
Victor Stinner8a1be612016-03-14 22:07:55 +0100682#ifdef WITH_THREAD
683 assert(PyGILState_Check());
684#endif
685
Victor Stinnere134a7f2015-03-30 10:09:31 +0200686 Py_BEGIN_ALLOW_THREADS
687 res = _Py_fstat_noraise(fd, status);
688 Py_END_ALLOW_THREADS
689
690 if (res != 0) {
691#ifdef MS_WINDOWS
692 PyErr_SetFromWindowsErr(0);
693#else
694 PyErr_SetFromErrno(PyExc_OSError);
695#endif
696 return -1;
697 }
698 return 0;
699}
Steve Dowerf2f373f2015-02-21 08:44:05 -0800700
Victor Stinner6672d0c2010-10-07 22:53:43 +0000701/* Call _wstat() on Windows, or encode the path to the filesystem encoding and
702 call stat() otherwise. Only fill st_mode attribute on Windows.
703
Victor Stinnerbd0850b2011-12-18 20:47:30 +0100704 Return 0 on success, -1 on _wstat() / stat() error, -2 if an exception was
705 raised. */
Victor Stinner4e314432010-10-07 21:45:39 +0000706
707int
Victor Stinnera4a75952010-10-07 22:23:10 +0000708_Py_stat(PyObject *path, struct stat *statbuf)
Victor Stinner4e314432010-10-07 21:45:39 +0000709{
710#ifdef MS_WINDOWS
Victor Stinner4e314432010-10-07 21:45:39 +0000711 int err;
712 struct _stat wstatbuf;
Victor Stinneree587ea2011-11-17 00:51:38 +0100713 wchar_t *wpath;
Victor Stinner4e314432010-10-07 21:45:39 +0000714
Victor Stinneree587ea2011-11-17 00:51:38 +0100715 wpath = PyUnicode_AsUnicode(path);
716 if (wpath == NULL)
Victor Stinnerbd0850b2011-12-18 20:47:30 +0100717 return -2;
Victor Stinneree587ea2011-11-17 00:51:38 +0100718 err = _wstat(wpath, &wstatbuf);
Victor Stinner4e314432010-10-07 21:45:39 +0000719 if (!err)
720 statbuf->st_mode = wstatbuf.st_mode;
721 return err;
722#else
723 int ret;
Victor Stinnera4a75952010-10-07 22:23:10 +0000724 PyObject *bytes = PyUnicode_EncodeFSDefault(path);
Victor Stinner4e314432010-10-07 21:45:39 +0000725 if (bytes == NULL)
Victor Stinnerbd0850b2011-12-18 20:47:30 +0100726 return -2;
Victor Stinner4e314432010-10-07 21:45:39 +0000727 ret = stat(PyBytes_AS_STRING(bytes), statbuf);
728 Py_DECREF(bytes);
729 return ret;
730#endif
731}
732
Victor Stinnerd45c7f82012-12-04 01:34:47 +0100733
Antoine Pitrou409b5382013-10-12 22:41:17 +0200734static int
Victor Stinnerdaf45552013-08-28 00:53:59 +0200735get_inheritable(int fd, int raise)
736{
737#ifdef MS_WINDOWS
738 HANDLE handle;
739 DWORD flags;
Victor Stinner6672d0c2010-10-07 22:53:43 +0000740
Steve Dower8fc89802015-04-12 00:26:27 -0400741 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +0200742 handle = (HANDLE)_get_osfhandle(fd);
Steve Dower8fc89802015-04-12 00:26:27 -0400743 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +0200744 if (handle == INVALID_HANDLE_VALUE) {
745 if (raise)
Steve Dower41e72442015-03-14 11:38:27 -0700746 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +0200747 return -1;
748 }
749
750 if (!GetHandleInformation(handle, &flags)) {
751 if (raise)
752 PyErr_SetFromWindowsErr(0);
753 return -1;
754 }
755
756 return (flags & HANDLE_FLAG_INHERIT);
757#else
758 int flags;
759
760 flags = fcntl(fd, F_GETFD, 0);
761 if (flags == -1) {
762 if (raise)
763 PyErr_SetFromErrno(PyExc_OSError);
764 return -1;
765 }
766 return !(flags & FD_CLOEXEC);
767#endif
768}
769
770/* Get the inheritable flag of the specified file descriptor.
Victor Stinnerb034eee2013-09-07 10:36:04 +0200771 Return 1 if the file descriptor can be inherited, 0 if it cannot,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200772 raise an exception and return -1 on error. */
773int
774_Py_get_inheritable(int fd)
775{
776 return get_inheritable(fd, 1);
777}
778
779static int
780set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works)
781{
782#ifdef MS_WINDOWS
783 HANDLE handle;
784 DWORD flags;
Victor Stinner282124b2014-09-02 11:41:04 +0200785#else
786#if defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)
787 static int ioctl_works = -1;
Victor Stinnerdaf45552013-08-28 00:53:59 +0200788 int request;
789 int err;
Victor Stinner282124b2014-09-02 11:41:04 +0200790#endif
Victor Stinnera858bbd2016-04-17 16:51:52 +0200791 int flags, new_flags;
Victor Stinnerdaf45552013-08-28 00:53:59 +0200792 int res;
793#endif
794
795 /* atomic_flag_works can only be used to make the file descriptor
796 non-inheritable */
797 assert(!(atomic_flag_works != NULL && inheritable));
798
799 if (atomic_flag_works != NULL && !inheritable) {
800 if (*atomic_flag_works == -1) {
Steve Dower41e72442015-03-14 11:38:27 -0700801 int isInheritable = get_inheritable(fd, raise);
802 if (isInheritable == -1)
Victor Stinnerdaf45552013-08-28 00:53:59 +0200803 return -1;
Steve Dower41e72442015-03-14 11:38:27 -0700804 *atomic_flag_works = !isInheritable;
Victor Stinnerdaf45552013-08-28 00:53:59 +0200805 }
806
807 if (*atomic_flag_works)
808 return 0;
809 }
810
811#ifdef MS_WINDOWS
Steve Dower8fc89802015-04-12 00:26:27 -0400812 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +0200813 handle = (HANDLE)_get_osfhandle(fd);
Steve Dower8fc89802015-04-12 00:26:27 -0400814 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +0200815 if (handle == INVALID_HANDLE_VALUE) {
816 if (raise)
Steve Dower41e72442015-03-14 11:38:27 -0700817 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +0200818 return -1;
819 }
820
821 if (inheritable)
822 flags = HANDLE_FLAG_INHERIT;
823 else
824 flags = 0;
825 if (!SetHandleInformation(handle, HANDLE_FLAG_INHERIT, flags)) {
826 if (raise)
827 PyErr_SetFromWindowsErr(0);
828 return -1;
829 }
830 return 0;
831
Victor Stinnerdaf45552013-08-28 00:53:59 +0200832#else
Victor Stinner282124b2014-09-02 11:41:04 +0200833
834#if defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)
835 if (ioctl_works != 0) {
836 /* fast-path: ioctl() only requires one syscall */
837 if (inheritable)
838 request = FIONCLEX;
839 else
840 request = FIOCLEX;
841 err = ioctl(fd, request, NULL);
842 if (!err) {
843 ioctl_works = 1;
844 return 0;
845 }
846
Victor Stinner3116cc42016-05-19 16:46:18 +0200847 if (errno != ENOTTY && errno != EACCES) {
Victor Stinner282124b2014-09-02 11:41:04 +0200848 if (raise)
849 PyErr_SetFromErrno(PyExc_OSError);
850 return -1;
851 }
852 else {
853 /* Issue #22258: Here, ENOTTY means "Inappropriate ioctl for
854 device". The ioctl is declared but not supported by the kernel.
855 Remember that ioctl() doesn't work. It is the case on
Victor Stinner3116cc42016-05-19 16:46:18 +0200856 Illumos-based OS for example.
857
858 Issue #27057: When SELinux policy disallows ioctl it will fail
859 with EACCES. While FIOCLEX is safe operation it may be
860 unavailable because ioctl was denied altogether.
861 This can be the case on Android. */
Victor Stinner282124b2014-09-02 11:41:04 +0200862 ioctl_works = 0;
863 }
864 /* fallback to fcntl() if ioctl() does not work */
865 }
866#endif
867
868 /* slow-path: fcntl() requires two syscalls */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200869 flags = fcntl(fd, F_GETFD);
870 if (flags < 0) {
871 if (raise)
872 PyErr_SetFromErrno(PyExc_OSError);
873 return -1;
874 }
875
Victor Stinnera858bbd2016-04-17 16:51:52 +0200876 if (inheritable) {
877 new_flags = flags & ~FD_CLOEXEC;
878 }
879 else {
880 new_flags = flags | FD_CLOEXEC;
881 }
882
883 if (new_flags == flags) {
884 /* FD_CLOEXEC flag already set/cleared: nothing to do */
885 return 0;
886 }
887
Victor Stinnerdaf45552013-08-28 00:53:59 +0200888 res = fcntl(fd, F_SETFD, flags);
889 if (res < 0) {
890 if (raise)
891 PyErr_SetFromErrno(PyExc_OSError);
892 return -1;
893 }
894 return 0;
895#endif
896}
897
898/* Make the file descriptor non-inheritable.
Victor Stinnerb034eee2013-09-07 10:36:04 +0200899 Return 0 on success, set errno and return -1 on error. */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200900static int
901make_non_inheritable(int fd)
902{
903 return set_inheritable(fd, 0, 0, NULL);
904}
905
906/* Set the inheritable flag of the specified file descriptor.
907 On success: return 0, on error: raise an exception if raise is nonzero
908 and return -1.
909
910 If atomic_flag_works is not NULL:
911
912 * if *atomic_flag_works==-1, check if the inheritable is set on the file
913 descriptor: if yes, set *atomic_flag_works to 1, otherwise set to 0 and
914 set the inheritable flag
915 * if *atomic_flag_works==1: do nothing
916 * if *atomic_flag_works==0: set inheritable flag to False
917
918 Set atomic_flag_works to NULL if no atomic flag was used to create the
919 file descriptor.
920
921 atomic_flag_works can only be used to make a file descriptor
922 non-inheritable: atomic_flag_works must be NULL if inheritable=1. */
923int
924_Py_set_inheritable(int fd, int inheritable, int *atomic_flag_works)
925{
926 return set_inheritable(fd, inheritable, 1, atomic_flag_works);
927}
928
Victor Stinnera555cfc2015-03-18 00:22:14 +0100929static int
930_Py_open_impl(const char *pathname, int flags, int gil_held)
Victor Stinnerdaf45552013-08-28 00:53:59 +0200931{
932 int fd;
Victor Stinnera47fc5c2015-03-18 09:52:54 +0100933 int async_err = 0;
Victor Stinnera555cfc2015-03-18 00:22:14 +0100934#ifndef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200935 int *atomic_flag_works;
Victor Stinnera555cfc2015-03-18 00:22:14 +0100936#endif
937
938#ifdef MS_WINDOWS
939 flags |= O_NOINHERIT;
940#elif defined(O_CLOEXEC)
Victor Stinnerdaf45552013-08-28 00:53:59 +0200941 atomic_flag_works = &_Py_open_cloexec_works;
942 flags |= O_CLOEXEC;
943#else
944 atomic_flag_works = NULL;
945#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +0200946
Victor Stinnera555cfc2015-03-18 00:22:14 +0100947 if (gil_held) {
Victor Stinnera47fc5c2015-03-18 09:52:54 +0100948 do {
949 Py_BEGIN_ALLOW_THREADS
950 fd = open(pathname, flags);
951 Py_END_ALLOW_THREADS
952 } while (fd < 0
953 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
954 if (async_err)
955 return -1;
Victor Stinnera555cfc2015-03-18 00:22:14 +0100956 if (fd < 0) {
957 PyErr_SetFromErrnoWithFilename(PyExc_OSError, pathname);
958 return -1;
959 }
960 }
961 else {
962 fd = open(pathname, flags);
963 if (fd < 0)
964 return -1;
965 }
966
967#ifndef MS_WINDOWS
968 if (set_inheritable(fd, 0, gil_held, atomic_flag_works) < 0) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200969 close(fd);
970 return -1;
971 }
Victor Stinnera555cfc2015-03-18 00:22:14 +0100972#endif
973
Victor Stinnerdaf45552013-08-28 00:53:59 +0200974 return fd;
975}
976
Victor Stinnera555cfc2015-03-18 00:22:14 +0100977/* Open a file with the specified flags (wrapper to open() function).
978 Return a file descriptor on success. Raise an exception and return -1 on
979 error.
980
981 The file descriptor is created non-inheritable.
982
Victor Stinnera47fc5c2015-03-18 09:52:54 +0100983 When interrupted by a signal (open() fails with EINTR), retry the syscall,
984 except if the Python signal handler raises an exception.
985
Victor Stinner6f4fae82015-04-01 18:34:32 +0200986 Release the GIL to call open(). The caller must hold the GIL. */
Victor Stinnera555cfc2015-03-18 00:22:14 +0100987int
988_Py_open(const char *pathname, int flags)
989{
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200990#ifdef WITH_THREAD
Victor Stinnera555cfc2015-03-18 00:22:14 +0100991 /* _Py_open() must be called with the GIL held. */
992 assert(PyGILState_Check());
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200993#endif
Victor Stinnera555cfc2015-03-18 00:22:14 +0100994 return _Py_open_impl(pathname, flags, 1);
995}
996
997/* Open a file with the specified flags (wrapper to open() function).
998 Return a file descriptor on success. Set errno and return -1 on error.
999
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001000 The file descriptor is created non-inheritable.
1001
1002 If interrupted by a signal, fail with EINTR. */
Victor Stinnera555cfc2015-03-18 00:22:14 +01001003int
1004_Py_open_noraise(const char *pathname, int flags)
1005{
1006 return _Py_open_impl(pathname, flags, 0);
1007}
1008
Victor Stinnerdaf45552013-08-28 00:53:59 +02001009/* Open a file. Use _wfopen() on Windows, encode the path to the locale
Victor Stinnere42ccd22015-03-18 01:39:23 +01001010 encoding and use fopen() otherwise.
1011
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001012 The file descriptor is created non-inheritable.
1013
1014 If interrupted by a signal, fail with EINTR. */
Victor Stinner4e314432010-10-07 21:45:39 +00001015FILE *
1016_Py_wfopen(const wchar_t *path, const wchar_t *mode)
1017{
Victor Stinner4e314432010-10-07 21:45:39 +00001018 FILE *f;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001019#ifndef MS_WINDOWS
Victor Stinner4e314432010-10-07 21:45:39 +00001020 char *cpath;
1021 char cmode[10];
1022 size_t r;
1023 r = wcstombs(cmode, mode, 10);
1024 if (r == (size_t)-1 || r >= 10) {
1025 errno = EINVAL;
1026 return NULL;
1027 }
Victor Stinnerf6a271a2014-08-01 12:28:48 +02001028 cpath = Py_EncodeLocale(path, NULL);
Victor Stinner4e314432010-10-07 21:45:39 +00001029 if (cpath == NULL)
1030 return NULL;
1031 f = fopen(cpath, cmode);
1032 PyMem_Free(cpath);
Victor Stinner4e314432010-10-07 21:45:39 +00001033#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02001034 f = _wfopen(path, mode);
Victor Stinner4e314432010-10-07 21:45:39 +00001035#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02001036 if (f == NULL)
1037 return NULL;
1038 if (make_non_inheritable(fileno(f)) < 0) {
1039 fclose(f);
1040 return NULL;
1041 }
1042 return f;
Victor Stinner4e314432010-10-07 21:45:39 +00001043}
1044
Victor Stinnere42ccd22015-03-18 01:39:23 +01001045/* Wrapper to fopen().
1046
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001047 The file descriptor is created non-inheritable.
1048
1049 If interrupted by a signal, fail with EINTR. */
Victor Stinnerdaf45552013-08-28 00:53:59 +02001050FILE*
1051_Py_fopen(const char *pathname, const char *mode)
1052{
1053 FILE *f = fopen(pathname, mode);
1054 if (f == NULL)
1055 return NULL;
1056 if (make_non_inheritable(fileno(f)) < 0) {
1057 fclose(f);
1058 return NULL;
1059 }
1060 return f;
1061}
1062
1063/* Open a file. Call _wfopen() on Windows, or encode the path to the filesystem
Victor Stinnere42ccd22015-03-18 01:39:23 +01001064 encoding and call fopen() otherwise.
Victor Stinner6672d0c2010-10-07 22:53:43 +00001065
Victor Stinnere42ccd22015-03-18 01:39:23 +01001066 Return the new file object on success. Raise an exception and return NULL
1067 on error.
1068
1069 The file descriptor is created non-inheritable.
1070
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001071 When interrupted by a signal (open() fails with EINTR), retry the syscall,
1072 except if the Python signal handler raises an exception.
1073
Victor Stinner6f4fae82015-04-01 18:34:32 +02001074 Release the GIL to call _wfopen() or fopen(). The caller must hold
1075 the GIL. */
Victor Stinner4e314432010-10-07 21:45:39 +00001076FILE*
Victor Stinnerdaf45552013-08-28 00:53:59 +02001077_Py_fopen_obj(PyObject *path, const char *mode)
Victor Stinner4e314432010-10-07 21:45:39 +00001078{
Victor Stinnerdaf45552013-08-28 00:53:59 +02001079 FILE *f;
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001080 int async_err = 0;
Victor Stinner4e314432010-10-07 21:45:39 +00001081#ifdef MS_WINDOWS
Victor Stinneree587ea2011-11-17 00:51:38 +01001082 wchar_t *wpath;
Victor Stinner4e314432010-10-07 21:45:39 +00001083 wchar_t wmode[10];
1084 int usize;
Victor Stinner4e314432010-10-07 21:45:39 +00001085
Victor Stinnerbc5b80b2015-10-11 09:54:42 +02001086#ifdef WITH_THREAD
Victor Stinnere42ccd22015-03-18 01:39:23 +01001087 assert(PyGILState_Check());
Victor Stinnerbc5b80b2015-10-11 09:54:42 +02001088#endif
Victor Stinnere42ccd22015-03-18 01:39:23 +01001089
Antoine Pitrou0e576f12011-12-22 10:03:38 +01001090 if (!PyUnicode_Check(path)) {
1091 PyErr_Format(PyExc_TypeError,
1092 "str file path expected under Windows, got %R",
1093 Py_TYPE(path));
1094 return NULL;
1095 }
Victor Stinneree587ea2011-11-17 00:51:38 +01001096 wpath = PyUnicode_AsUnicode(path);
1097 if (wpath == NULL)
1098 return NULL;
1099
Victor Stinner4e314432010-10-07 21:45:39 +00001100 usize = MultiByteToWideChar(CP_ACP, 0, mode, -1, wmode, sizeof(wmode));
Victor Stinnere42ccd22015-03-18 01:39:23 +01001101 if (usize == 0) {
1102 PyErr_SetFromWindowsErr(0);
Victor Stinner4e314432010-10-07 21:45:39 +00001103 return NULL;
Victor Stinnere42ccd22015-03-18 01:39:23 +01001104 }
Victor Stinner4e314432010-10-07 21:45:39 +00001105
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001106 do {
1107 Py_BEGIN_ALLOW_THREADS
1108 f = _wfopen(wpath, wmode);
1109 Py_END_ALLOW_THREADS
1110 } while (f == NULL
1111 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Victor Stinner4e314432010-10-07 21:45:39 +00001112#else
Antoine Pitrou2b1cc892011-12-19 18:19:06 +01001113 PyObject *bytes;
Victor Stinnere42ccd22015-03-18 01:39:23 +01001114 char *path_bytes;
1115
Victor Stinnerbc5b80b2015-10-11 09:54:42 +02001116#ifdef WITH_THREAD
Victor Stinnere42ccd22015-03-18 01:39:23 +01001117 assert(PyGILState_Check());
Victor Stinnerbc5b80b2015-10-11 09:54:42 +02001118#endif
Victor Stinnere42ccd22015-03-18 01:39:23 +01001119
Antoine Pitrou2b1cc892011-12-19 18:19:06 +01001120 if (!PyUnicode_FSConverter(path, &bytes))
Victor Stinner4e314432010-10-07 21:45:39 +00001121 return NULL;
Victor Stinnere42ccd22015-03-18 01:39:23 +01001122 path_bytes = PyBytes_AS_STRING(bytes);
1123
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001124 do {
1125 Py_BEGIN_ALLOW_THREADS
1126 f = fopen(path_bytes, mode);
1127 Py_END_ALLOW_THREADS
1128 } while (f == NULL
1129 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Victor Stinnere42ccd22015-03-18 01:39:23 +01001130
Victor Stinner4e314432010-10-07 21:45:39 +00001131 Py_DECREF(bytes);
Victor Stinner4e314432010-10-07 21:45:39 +00001132#endif
Victor Stinnera47fc5c2015-03-18 09:52:54 +01001133 if (async_err)
1134 return NULL;
1135
Victor Stinnere42ccd22015-03-18 01:39:23 +01001136 if (f == NULL) {
1137 PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001138 return NULL;
Victor Stinnere42ccd22015-03-18 01:39:23 +01001139 }
1140
1141 if (set_inheritable(fileno(f), 0, 1, NULL) < 0) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001142 fclose(f);
1143 return NULL;
1144 }
1145 return f;
Victor Stinner4e314432010-10-07 21:45:39 +00001146}
1147
Victor Stinner66aab0c2015-03-19 22:53:20 +01001148/* Read count bytes from fd into buf.
Victor Stinner82c3e452015-04-01 18:34:45 +02001149
1150 On success, return the number of read bytes, it can be lower than count.
1151 If the current file offset is at or past the end of file, no bytes are read,
1152 and read() returns zero.
1153
1154 On error, raise an exception, set errno and return -1.
1155
1156 When interrupted by a signal (read() fails with EINTR), retry the syscall.
1157 If the Python signal handler raises an exception, the function returns -1
1158 (the syscall is not retried).
1159
1160 Release the GIL to call read(). The caller must hold the GIL. */
Victor Stinner66aab0c2015-03-19 22:53:20 +01001161Py_ssize_t
1162_Py_read(int fd, void *buf, size_t count)
1163{
1164 Py_ssize_t n;
Victor Stinnera3c02022015-03-20 11:58:18 +01001165 int err;
Victor Stinner66aab0c2015-03-19 22:53:20 +01001166 int async_err = 0;
1167
Victor Stinner8a1be612016-03-14 22:07:55 +01001168#ifdef WITH_THREAD
1169 assert(PyGILState_Check());
1170#endif
1171
Victor Stinner66aab0c2015-03-19 22:53:20 +01001172 /* _Py_read() must not be called with an exception set, otherwise the
1173 * caller may think that read() was interrupted by a signal and the signal
1174 * handler raised an exception. */
1175 assert(!PyErr_Occurred());
1176
Victor Stinner66aab0c2015-03-19 22:53:20 +01001177#ifdef MS_WINDOWS
1178 if (count > INT_MAX) {
1179 /* On Windows, the count parameter of read() is an int */
1180 count = INT_MAX;
1181 }
1182#else
1183 if (count > PY_SSIZE_T_MAX) {
1184 /* if count is greater than PY_SSIZE_T_MAX,
1185 * read() result is undefined */
1186 count = PY_SSIZE_T_MAX;
1187 }
1188#endif
1189
Steve Dower8fc89802015-04-12 00:26:27 -04001190 _Py_BEGIN_SUPPRESS_IPH
Victor Stinner66aab0c2015-03-19 22:53:20 +01001191 do {
1192 Py_BEGIN_ALLOW_THREADS
1193 errno = 0;
1194#ifdef MS_WINDOWS
1195 n = read(fd, buf, (int)count);
1196#else
1197 n = read(fd, buf, count);
1198#endif
Victor Stinnera3c02022015-03-20 11:58:18 +01001199 /* save/restore errno because PyErr_CheckSignals()
1200 * and PyErr_SetFromErrno() can modify it */
1201 err = errno;
Victor Stinner66aab0c2015-03-19 22:53:20 +01001202 Py_END_ALLOW_THREADS
Victor Stinnera3c02022015-03-20 11:58:18 +01001203 } while (n < 0 && err == EINTR &&
Victor Stinner66aab0c2015-03-19 22:53:20 +01001204 !(async_err = PyErr_CheckSignals()));
Steve Dower8fc89802015-04-12 00:26:27 -04001205 _Py_END_SUPPRESS_IPH
Victor Stinner66aab0c2015-03-19 22:53:20 +01001206
1207 if (async_err) {
1208 /* read() was interrupted by a signal (failed with EINTR)
1209 * and the Python signal handler raised an exception */
Victor Stinnera3c02022015-03-20 11:58:18 +01001210 errno = err;
1211 assert(errno == EINTR && PyErr_Occurred());
Victor Stinner66aab0c2015-03-19 22:53:20 +01001212 return -1;
1213 }
1214 if (n < 0) {
Victor Stinner66aab0c2015-03-19 22:53:20 +01001215 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera3c02022015-03-20 11:58:18 +01001216 errno = err;
Victor Stinner66aab0c2015-03-19 22:53:20 +01001217 return -1;
1218 }
1219
1220 return n;
1221}
1222
Victor Stinner82c3e452015-04-01 18:34:45 +02001223static Py_ssize_t
1224_Py_write_impl(int fd, const void *buf, size_t count, int gil_held)
Victor Stinner66aab0c2015-03-19 22:53:20 +01001225{
1226 Py_ssize_t n;
Victor Stinnera3c02022015-03-20 11:58:18 +01001227 int err;
Victor Stinner66aab0c2015-03-19 22:53:20 +01001228 int async_err = 0;
1229
Steve Dower8fc89802015-04-12 00:26:27 -04001230 _Py_BEGIN_SUPPRESS_IPH
Victor Stinner66aab0c2015-03-19 22:53:20 +01001231#ifdef MS_WINDOWS
1232 if (count > 32767 && isatty(fd)) {
1233 /* Issue #11395: the Windows console returns an error (12: not
1234 enough space error) on writing into stdout if stdout mode is
1235 binary and the length is greater than 66,000 bytes (or less,
1236 depending on heap usage). */
1237 count = 32767;
1238 }
1239 else if (count > INT_MAX)
1240 count = INT_MAX;
1241#else
1242 if (count > PY_SSIZE_T_MAX) {
1243 /* write() should truncate count to PY_SSIZE_T_MAX, but it's safer
1244 * to do it ourself to have a portable behaviour. */
1245 count = PY_SSIZE_T_MAX;
1246 }
1247#endif
1248
Victor Stinner82c3e452015-04-01 18:34:45 +02001249 if (gil_held) {
1250 do {
1251 Py_BEGIN_ALLOW_THREADS
1252 errno = 0;
Victor Stinner66aab0c2015-03-19 22:53:20 +01001253#ifdef MS_WINDOWS
Victor Stinner82c3e452015-04-01 18:34:45 +02001254 n = write(fd, buf, (int)count);
Victor Stinner66aab0c2015-03-19 22:53:20 +01001255#else
Victor Stinner82c3e452015-04-01 18:34:45 +02001256 n = write(fd, buf, count);
Victor Stinner66aab0c2015-03-19 22:53:20 +01001257#endif
Victor Stinner82c3e452015-04-01 18:34:45 +02001258 /* save/restore errno because PyErr_CheckSignals()
1259 * and PyErr_SetFromErrno() can modify it */
1260 err = errno;
1261 Py_END_ALLOW_THREADS
1262 } while (n < 0 && err == EINTR &&
1263 !(async_err = PyErr_CheckSignals()));
1264 }
1265 else {
1266 do {
1267 errno = 0;
1268#ifdef MS_WINDOWS
1269 n = write(fd, buf, (int)count);
1270#else
1271 n = write(fd, buf, count);
1272#endif
1273 err = errno;
1274 } while (n < 0 && err == EINTR);
1275 }
Steve Dower8fc89802015-04-12 00:26:27 -04001276 _Py_END_SUPPRESS_IPH
Victor Stinner66aab0c2015-03-19 22:53:20 +01001277
1278 if (async_err) {
1279 /* write() was interrupted by a signal (failed with EINTR)
Victor Stinner82c3e452015-04-01 18:34:45 +02001280 and the Python signal handler raised an exception (if gil_held is
1281 nonzero). */
Victor Stinnera3c02022015-03-20 11:58:18 +01001282 errno = err;
Victor Stinner82c3e452015-04-01 18:34:45 +02001283 assert(errno == EINTR && (!gil_held || PyErr_Occurred()));
Victor Stinner66aab0c2015-03-19 22:53:20 +01001284 return -1;
1285 }
1286 if (n < 0) {
Victor Stinner82c3e452015-04-01 18:34:45 +02001287 if (gil_held)
1288 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera3c02022015-03-20 11:58:18 +01001289 errno = err;
Victor Stinner66aab0c2015-03-19 22:53:20 +01001290 return -1;
1291 }
1292
1293 return n;
1294}
1295
Victor Stinner82c3e452015-04-01 18:34:45 +02001296/* Write count bytes of buf into fd.
1297
1298 On success, return the number of written bytes, it can be lower than count
1299 including 0. On error, raise an exception, set errno and return -1.
1300
1301 When interrupted by a signal (write() fails with EINTR), retry the syscall.
1302 If the Python signal handler raises an exception, the function returns -1
1303 (the syscall is not retried).
1304
1305 Release the GIL to call write(). The caller must hold the GIL. */
1306Py_ssize_t
1307_Py_write(int fd, const void *buf, size_t count)
1308{
Victor Stinner8a1be612016-03-14 22:07:55 +01001309#ifdef WITH_THREAD
1310 assert(PyGILState_Check());
1311#endif
1312
Victor Stinner82c3e452015-04-01 18:34:45 +02001313 /* _Py_write() must not be called with an exception set, otherwise the
1314 * caller may think that write() was interrupted by a signal and the signal
1315 * handler raised an exception. */
1316 assert(!PyErr_Occurred());
1317
1318 return _Py_write_impl(fd, buf, count, 1);
1319}
1320
1321/* Write count bytes of buf into fd.
1322 *
1323 * On success, return the number of written bytes, it can be lower than count
1324 * including 0. On error, set errno and return -1.
1325 *
1326 * When interrupted by a signal (write() fails with EINTR), retry the syscall
1327 * without calling the Python signal handler. */
1328Py_ssize_t
1329_Py_write_noraise(int fd, const void *buf, size_t count)
1330{
1331 return _Py_write_impl(fd, buf, count, 0);
1332}
1333
Victor Stinner4e314432010-10-07 21:45:39 +00001334#ifdef HAVE_READLINK
Victor Stinner6672d0c2010-10-07 22:53:43 +00001335
1336/* Read value of symbolic link. Encode the path to the locale encoding, decode
Victor Stinneraf02e1c2011-12-16 23:56:01 +01001337 the result from the locale encoding. Return -1 on error. */
Victor Stinner6672d0c2010-10-07 22:53:43 +00001338
Victor Stinner4e314432010-10-07 21:45:39 +00001339int
1340_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
1341{
1342 char *cpath;
Victor Stinnerb11d6cb2013-11-15 18:14:11 +01001343 char cbuf[MAXPATHLEN];
Victor Stinner3f711f42010-10-16 22:47:37 +00001344 wchar_t *wbuf;
Victor Stinner4e314432010-10-07 21:45:39 +00001345 int res;
1346 size_t r1;
1347
Victor Stinnerf6a271a2014-08-01 12:28:48 +02001348 cpath = Py_EncodeLocale(path, NULL);
Victor Stinner4e314432010-10-07 21:45:39 +00001349 if (cpath == NULL) {
1350 errno = EINVAL;
1351 return -1;
1352 }
Victor Stinnerb11d6cb2013-11-15 18:14:11 +01001353 res = (int)readlink(cpath, cbuf, Py_ARRAY_LENGTH(cbuf));
Victor Stinner4e314432010-10-07 21:45:39 +00001354 PyMem_Free(cpath);
1355 if (res == -1)
1356 return -1;
Victor Stinnerb11d6cb2013-11-15 18:14:11 +01001357 if (res == Py_ARRAY_LENGTH(cbuf)) {
Victor Stinner4e314432010-10-07 21:45:39 +00001358 errno = EINVAL;
1359 return -1;
1360 }
1361 cbuf[res] = '\0'; /* buf will be null terminated */
Victor Stinnerf6a271a2014-08-01 12:28:48 +02001362 wbuf = Py_DecodeLocale(cbuf, &r1);
Victor Stinner350147b2010-10-16 22:52:09 +00001363 if (wbuf == NULL) {
1364 errno = EINVAL;
1365 return -1;
1366 }
Victor Stinner3f711f42010-10-16 22:47:37 +00001367 if (bufsiz <= r1) {
Victor Stinner1a7425f2013-07-07 16:25:15 +02001368 PyMem_RawFree(wbuf);
Victor Stinner4e314432010-10-07 21:45:39 +00001369 errno = EINVAL;
1370 return -1;
1371 }
Victor Stinner3f711f42010-10-16 22:47:37 +00001372 wcsncpy(buf, wbuf, bufsiz);
Victor Stinner1a7425f2013-07-07 16:25:15 +02001373 PyMem_RawFree(wbuf);
Victor Stinner4e314432010-10-07 21:45:39 +00001374 return (int)r1;
1375}
1376#endif
1377
1378#ifdef HAVE_REALPATH
Victor Stinner6672d0c2010-10-07 22:53:43 +00001379
1380/* Return the canonicalized absolute pathname. Encode path to the locale
Victor Stinneraf02e1c2011-12-16 23:56:01 +01001381 encoding, decode the result from the locale encoding.
1382 Return NULL on error. */
Victor Stinner6672d0c2010-10-07 22:53:43 +00001383
Victor Stinner4e314432010-10-07 21:45:39 +00001384wchar_t*
Victor Stinner015f4d82010-10-07 22:29:53 +00001385_Py_wrealpath(const wchar_t *path,
1386 wchar_t *resolved_path, size_t resolved_path_size)
Victor Stinner4e314432010-10-07 21:45:39 +00001387{
1388 char *cpath;
Victor Stinnerb11d6cb2013-11-15 18:14:11 +01001389 char cresolved_path[MAXPATHLEN];
Victor Stinner0a1b8cb2010-10-16 22:55:47 +00001390 wchar_t *wresolved_path;
Victor Stinner4e314432010-10-07 21:45:39 +00001391 char *res;
1392 size_t r;
Victor Stinnerf6a271a2014-08-01 12:28:48 +02001393 cpath = Py_EncodeLocale(path, NULL);
Victor Stinner4e314432010-10-07 21:45:39 +00001394 if (cpath == NULL) {
1395 errno = EINVAL;
1396 return NULL;
1397 }
1398 res = realpath(cpath, cresolved_path);
1399 PyMem_Free(cpath);
1400 if (res == NULL)
1401 return NULL;
Victor Stinner0a1b8cb2010-10-16 22:55:47 +00001402
Victor Stinnerf6a271a2014-08-01 12:28:48 +02001403 wresolved_path = Py_DecodeLocale(cresolved_path, &r);
Victor Stinner0a1b8cb2010-10-16 22:55:47 +00001404 if (wresolved_path == NULL) {
Victor Stinner4e314432010-10-07 21:45:39 +00001405 errno = EINVAL;
1406 return NULL;
1407 }
Victor Stinner0a1b8cb2010-10-16 22:55:47 +00001408 if (resolved_path_size <= r) {
Victor Stinner1a7425f2013-07-07 16:25:15 +02001409 PyMem_RawFree(wresolved_path);
Victor Stinner0a1b8cb2010-10-16 22:55:47 +00001410 errno = EINVAL;
1411 return NULL;
1412 }
1413 wcsncpy(resolved_path, wresolved_path, resolved_path_size);
Victor Stinner1a7425f2013-07-07 16:25:15 +02001414 PyMem_RawFree(wresolved_path);
Victor Stinner4e314432010-10-07 21:45:39 +00001415 return resolved_path;
1416}
1417#endif
1418
Victor Stinnerf4061da2010-10-14 12:37:19 +00001419/* Get the current directory. size is the buffer size in wide characters
Victor Stinneraf02e1c2011-12-16 23:56:01 +01001420 including the null character. Decode the path from the locale encoding.
1421 Return NULL on error. */
Victor Stinner6672d0c2010-10-07 22:53:43 +00001422
Victor Stinner4e314432010-10-07 21:45:39 +00001423wchar_t*
1424_Py_wgetcwd(wchar_t *buf, size_t size)
1425{
1426#ifdef MS_WINDOWS
Victor Stinner56785ea2013-06-05 00:46:29 +02001427 int isize = (int)Py_MIN(size, INT_MAX);
1428 return _wgetcwd(buf, isize);
Victor Stinner4e314432010-10-07 21:45:39 +00001429#else
Victor Stinnerb11d6cb2013-11-15 18:14:11 +01001430 char fname[MAXPATHLEN];
Victor Stinnerf4061da2010-10-14 12:37:19 +00001431 wchar_t *wname;
Victor Stinner168e1172010-10-16 23:16:16 +00001432 size_t len;
Victor Stinnerf4061da2010-10-14 12:37:19 +00001433
Victor Stinnerb11d6cb2013-11-15 18:14:11 +01001434 if (getcwd(fname, Py_ARRAY_LENGTH(fname)) == NULL)
Victor Stinner4e314432010-10-07 21:45:39 +00001435 return NULL;
Victor Stinnerf6a271a2014-08-01 12:28:48 +02001436 wname = Py_DecodeLocale(fname, &len);
Victor Stinnerf4061da2010-10-14 12:37:19 +00001437 if (wname == NULL)
1438 return NULL;
Victor Stinner168e1172010-10-16 23:16:16 +00001439 if (size <= len) {
Victor Stinner1a7425f2013-07-07 16:25:15 +02001440 PyMem_RawFree(wname);
Victor Stinner4e314432010-10-07 21:45:39 +00001441 return NULL;
1442 }
Victor Stinnerf4061da2010-10-14 12:37:19 +00001443 wcsncpy(buf, wname, size);
Victor Stinner1a7425f2013-07-07 16:25:15 +02001444 PyMem_RawFree(wname);
Victor Stinner4e314432010-10-07 21:45:39 +00001445 return buf;
1446#endif
1447}
1448
Victor Stinnerdaf45552013-08-28 00:53:59 +02001449/* Duplicate a file descriptor. The new file descriptor is created as
1450 non-inheritable. Return a new file descriptor on success, raise an OSError
1451 exception and return -1 on error.
1452
1453 The GIL is released to call dup(). The caller must hold the GIL. */
1454int
1455_Py_dup(int fd)
1456{
1457#ifdef MS_WINDOWS
1458 HANDLE handle;
1459 DWORD ftype;
1460#endif
1461
Victor Stinner8a1be612016-03-14 22:07:55 +01001462#ifdef WITH_THREAD
1463 assert(PyGILState_Check());
1464#endif
1465
Victor Stinnerdaf45552013-08-28 00:53:59 +02001466#ifdef MS_WINDOWS
Steve Dower8fc89802015-04-12 00:26:27 -04001467 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001468 handle = (HANDLE)_get_osfhandle(fd);
Steve Dower8fc89802015-04-12 00:26:27 -04001469 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001470 if (handle == INVALID_HANDLE_VALUE) {
Steve Dower41e72442015-03-14 11:38:27 -07001471 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001472 return -1;
1473 }
1474
1475 /* get the file type, ignore the error if it failed */
1476 ftype = GetFileType(handle);
1477
1478 Py_BEGIN_ALLOW_THREADS
Steve Dower8fc89802015-04-12 00:26:27 -04001479 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001480 fd = dup(fd);
Steve Dower8fc89802015-04-12 00:26:27 -04001481 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001482 Py_END_ALLOW_THREADS
1483 if (fd < 0) {
1484 PyErr_SetFromErrno(PyExc_OSError);
1485 return -1;
1486 }
1487
1488 /* Character files like console cannot be make non-inheritable */
1489 if (ftype != FILE_TYPE_CHAR) {
1490 if (_Py_set_inheritable(fd, 0, NULL) < 0) {
Steve Dower8fc89802015-04-12 00:26:27 -04001491 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001492 close(fd);
Steve Dower8fc89802015-04-12 00:26:27 -04001493 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001494 return -1;
1495 }
1496 }
1497#elif defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC)
1498 Py_BEGIN_ALLOW_THREADS
Steve Dower8fc89802015-04-12 00:26:27 -04001499 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001500 fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
Steve Dower8fc89802015-04-12 00:26:27 -04001501 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001502 Py_END_ALLOW_THREADS
1503 if (fd < 0) {
1504 PyErr_SetFromErrno(PyExc_OSError);
1505 return -1;
1506 }
1507
1508#else
1509 Py_BEGIN_ALLOW_THREADS
Steve Dower8fc89802015-04-12 00:26:27 -04001510 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001511 fd = dup(fd);
Steve Dower8fc89802015-04-12 00:26:27 -04001512 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001513 Py_END_ALLOW_THREADS
1514 if (fd < 0) {
1515 PyErr_SetFromErrno(PyExc_OSError);
1516 return -1;
1517 }
1518
1519 if (_Py_set_inheritable(fd, 0, NULL) < 0) {
Steve Dower8fc89802015-04-12 00:26:27 -04001520 _Py_BEGIN_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001521 close(fd);
Steve Dower8fc89802015-04-12 00:26:27 -04001522 _Py_END_SUPPRESS_IPH
Victor Stinnerdaf45552013-08-28 00:53:59 +02001523 return -1;
1524 }
1525#endif
1526 return fd;
1527}
1528
Victor Stinner1db9e7b2014-07-29 22:32:47 +02001529#ifndef MS_WINDOWS
1530/* Get the blocking mode of the file descriptor.
1531 Return 0 if the O_NONBLOCK flag is set, 1 if the flag is cleared,
1532 raise an exception and return -1 on error. */
1533int
1534_Py_get_blocking(int fd)
1535{
Steve Dower8fc89802015-04-12 00:26:27 -04001536 int flags;
1537 _Py_BEGIN_SUPPRESS_IPH
1538 flags = fcntl(fd, F_GETFL, 0);
1539 _Py_END_SUPPRESS_IPH
Victor Stinner1db9e7b2014-07-29 22:32:47 +02001540 if (flags < 0) {
1541 PyErr_SetFromErrno(PyExc_OSError);
1542 return -1;
1543 }
1544
1545 return !(flags & O_NONBLOCK);
1546}
1547
1548/* Set the blocking mode of the specified file descriptor.
1549
1550 Set the O_NONBLOCK flag if blocking is False, clear the O_NONBLOCK flag
1551 otherwise.
1552
1553 Return 0 on success, raise an exception and return -1 on error. */
1554int
1555_Py_set_blocking(int fd, int blocking)
1556{
1557#if defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)
1558 int arg = !blocking;
1559 if (ioctl(fd, FIONBIO, &arg) < 0)
1560 goto error;
1561#else
1562 int flags, res;
1563
Steve Dower8fc89802015-04-12 00:26:27 -04001564 _Py_BEGIN_SUPPRESS_IPH
Victor Stinner1db9e7b2014-07-29 22:32:47 +02001565 flags = fcntl(fd, F_GETFL, 0);
Steve Dower8fc89802015-04-12 00:26:27 -04001566 if (flags >= 0) {
1567 if (blocking)
1568 flags = flags & (~O_NONBLOCK);
1569 else
1570 flags = flags | O_NONBLOCK;
Victor Stinner1db9e7b2014-07-29 22:32:47 +02001571
Steve Dower8fc89802015-04-12 00:26:27 -04001572 res = fcntl(fd, F_SETFL, flags);
1573 } else {
1574 res = -1;
1575 }
1576 _Py_END_SUPPRESS_IPH
Victor Stinner1db9e7b2014-07-29 22:32:47 +02001577
Victor Stinner1db9e7b2014-07-29 22:32:47 +02001578 if (res < 0)
1579 goto error;
1580#endif
1581 return 0;
1582
1583error:
1584 PyErr_SetFromErrno(PyExc_OSError);
1585 return -1;
1586}
1587#endif