blob: 4797cdc2c05325595d6c8395886182f23581f251 [file] [log] [blame]
Guido van Rossum29c1ea51997-08-07 00:11:34 +00001/*********************************************************
2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003 msvcrtmodule.c
Guido van Rossum29c1ea51997-08-07 00:11:34 +00004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005 A Python interface to the Microsoft Visual C Runtime
6 Library, providing access to those non-portable, but
7 still useful routines.
Guido van Rossum29c1ea51997-08-07 00:11:34 +00008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00009 Only ever compiled with an MS compiler, so no attempt
10 has been made to avoid MS language extensions, etc...
Guido van Rossum29c1ea51997-08-07 00:11:34 +000011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000012 This may only work on NT or 95...
Guido van Rossum407a22d1997-08-13 19:57:53 +000013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000014 Author: Mark Hammond and Guido van Rossum.
15 Maintenance: Guido van Rossum.
Guido van Rossum407a22d1997-08-13 19:57:53 +000016
Guido van Rossum29c1ea51997-08-07 00:11:34 +000017***********************************************************/
Guido van Rossum407a22d1997-08-13 19:57:53 +000018
Guido van Rossum29c1ea51997-08-07 00:11:34 +000019#include "Python.h"
20#include "malloc.h"
Tim Peters5fa0bd62000-12-12 01:58:56 +000021#include <io.h>
22#include <conio.h>
23#include <sys/locking.h>
Martin v. Löwis3dc33d12007-08-31 07:58:36 +000024#include <crtdbg.h>
25#include <windows.h>
Guido van Rossum29c1ea51997-08-07 00:11:34 +000026
Benjamin Peterson4469d0c2008-11-30 22:46:23 +000027#ifdef _MSC_VER
Martin v. Löwis3afc62e2010-02-18 16:27:43 +000028#if _MSC_VER >= 1500 && _MSC_VER < 1600
Benjamin Peterson4469d0c2008-11-30 22:46:23 +000029#include <crtassem.h>
Brian Curtin401f9f32012-05-13 11:19:23 -050030#elif _MSC_VER >= 1600
31#include <crtversion.h>
Benjamin Peterson4469d0c2008-11-30 22:46:23 +000032#endif
33#endif
34
Zachary Ware45520892015-05-13 01:22:32 -050035/*[python input]
Benjamin Petersonca470632016-09-06 13:47:26 -070036class intptr_t_converter(CConverter):
37 type = 'intptr_t'
Zachary Ware45520892015-05-13 01:22:32 -050038 format_unit = '"_Py_PARSE_INTPTR"'
Guido van Rossum407a22d1997-08-13 19:57:53 +000039
Zachary Ware45520892015-05-13 01:22:32 -050040class handle_return_converter(long_return_converter):
Benjamin Petersonca470632016-09-06 13:47:26 -070041 type = 'intptr_t'
Zachary Ware45520892015-05-13 01:22:32 -050042 cast = '(void *)'
43 conversion_fn = 'PyLong_FromVoidPtr'
44
45class byte_char_return_converter(CReturnConverter):
46 type = 'int'
47
48 def render(self, function, data):
49 data.declarations.append('char s[1];')
50 data.return_value = 's[0]'
51 data.return_conversion.append(
52 'return_value = PyBytes_FromStringAndSize(s, 1);\n')
53
54class wchar_t_return_converter(CReturnConverter):
55 type = 'wchar_t'
56
57 def render(self, function, data):
58 self.declare(data)
59 data.return_conversion.append(
60 'return_value = PyUnicode_FromOrdinal(_return_value);\n')
61[python start generated code]*/
Benjamin Petersoncc854492016-09-08 09:29:11 -070062/*[python end generated code: output=da39a3ee5e6b4b0d input=b59f1663dba11997]*/
Zachary Ware45520892015-05-13 01:22:32 -050063
64/*[clinic input]
65module msvcrt
66[clinic start generated code]*/
67/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f31a87a783d036cd]*/
68
69#include "clinic/msvcrtmodule.c.h"
70
71/*[clinic input]
72msvcrt.heapmin
73
74Minimize the malloc() heap.
75
76Force the malloc() heap to clean itself up and return unused blocks
77to the operating system. On failure, this raises OSError.
78[clinic start generated code]*/
79
80static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030081msvcrt_heapmin_impl(PyObject *module)
82/*[clinic end generated code: output=1ba00f344782dc19 input=82e1771d21bde2d8]*/
Zachary Ware45520892015-05-13 01:22:32 -050083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 if (_heapmin() != 0)
85 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +000086
Zachary Ware45520892015-05-13 01:22:32 -050087 Py_RETURN_NONE;
Guido van Rossum29c1ea51997-08-07 00:11:34 +000088}
Zachary Ware45520892015-05-13 01:22:32 -050089/*[clinic input]
90msvcrt.locking
Guido van Rossum29c1ea51997-08-07 00:11:34 +000091
Zachary Ware45520892015-05-13 01:22:32 -050092 fd: int
93 mode: int
94 nbytes: long
95 /
Benjamin Peterson1baf4652009-12-31 03:11:23 +000096
Zachary Ware45520892015-05-13 01:22:32 -050097Lock part of a file based on file descriptor fd from the C runtime.
98
99Raises IOError on failure. The locked region of the file extends from
100the current file position for nbytes bytes, and may continue beyond
101the end of the file. mode must be one of the LK_* constants listed
102below. Multiple regions in a file may be locked at the same time, but
103may not overlap. Adjacent regions are not merged; they must be unlocked
104individually.
105[clinic start generated code]*/
106
Tim Peters5fa0bd62000-12-12 01:58:56 +0000107static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300108msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes)
109/*[clinic end generated code: output=a4a90deca9785a03 input=d9f13f0f6a713ba7]*/
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 int err;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_BEGIN_ALLOW_THREADS
Steve Dower21fae032017-02-04 15:05:13 -0800114 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 err = _locking(fd, mode, nbytes);
Steve Dower21fae032017-02-04 15:05:13 -0800116 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 Py_END_ALLOW_THREADS
118 if (err != 0)
119 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000120
Zachary Ware45520892015-05-13 01:22:32 -0500121 Py_RETURN_NONE;
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000122}
Guido van Rossum407a22d1997-08-13 19:57:53 +0000123
Zachary Ware45520892015-05-13 01:22:32 -0500124/*[clinic input]
125msvcrt.setmode -> long
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000126
Zachary Ware45520892015-05-13 01:22:32 -0500127 fd: int
128 mode as flags: int
129 /
130
131Set the line-end translation mode for the file descriptor fd.
132
133To set it to text mode, flags should be os.O_TEXT; for binary, it
134should be os.O_BINARY.
135
136Return value is the previous mode.
137[clinic start generated code]*/
138
139static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300140msvcrt_setmode_impl(PyObject *module, int fd, int flags)
141/*[clinic end generated code: output=24a9be5ea07ccb9b input=76e7c01f6b137f75]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000142{
Steve Dower21fae032017-02-04 15:05:13 -0800143 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 flags = _setmode(fd, flags);
Steve Dower21fae032017-02-04 15:05:13 -0800145 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 if (flags == -1)
Zachary Ware45520892015-05-13 01:22:32 -0500147 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000148
Zachary Ware45520892015-05-13 01:22:32 -0500149 return flags;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000150}
151
Zachary Ware45520892015-05-13 01:22:32 -0500152/*[clinic input]
153msvcrt.open_osfhandle -> long
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000154
Benjamin Petersonca470632016-09-06 13:47:26 -0700155 handle: intptr_t
Zachary Ware45520892015-05-13 01:22:32 -0500156 flags: int
157 /
158
159Create a C runtime file descriptor from the file handle handle.
160
161The flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,
162and os.O_TEXT. The returned file descriptor may be used as a parameter
163to os.fdopen() to create a file object.
164[clinic start generated code]*/
165
166static long
Benjamin Petersonca470632016-09-06 13:47:26 -0700167msvcrt_open_osfhandle_impl(PyObject *module, intptr_t handle, int flags)
Benjamin Petersoncc854492016-09-08 09:29:11 -0700168/*[clinic end generated code: output=cede871bf939d6e3 input=cb2108bbea84514e]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 int fd;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000171
Steve Dower21fae032017-02-04 15:05:13 -0800172 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 fd = _open_osfhandle(handle, flags);
Steve Dower21fae032017-02-04 15:05:13 -0800174 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 if (fd == -1)
Zachary Ware45520892015-05-13 01:22:32 -0500176 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000177
Zachary Ware45520892015-05-13 01:22:32 -0500178 return fd;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000179}
180
Zachary Ware45520892015-05-13 01:22:32 -0500181/*[clinic input]
182msvcrt.get_osfhandle -> handle
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000183
Zachary Ware45520892015-05-13 01:22:32 -0500184 fd: int
185 /
186
187Return the file handle for the file descriptor fd.
188
189Raises IOError if fd is not recognized.
190[clinic start generated code]*/
191
Benjamin Petersonca470632016-09-06 13:47:26 -0700192static intptr_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300193msvcrt_get_osfhandle_impl(PyObject *module, int fd)
Benjamin Petersoncc854492016-09-08 09:29:11 -0700194/*[clinic end generated code: output=7ce761dd0de2b503 input=c7d18d02c8017ec1]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000195{
Benjamin Petersonca470632016-09-06 13:47:26 -0700196 intptr_t handle = -1;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000197
Steve Dower8fc89802015-04-12 00:26:27 -0400198 _Py_BEGIN_SUPPRESS_IPH
Steve Dower940f33a2016-09-08 11:21:54 -0700199 handle = _get_osfhandle(fd);
Steve Dower8fc89802015-04-12 00:26:27 -0400200 _Py_END_SUPPRESS_IPH
Steve Dower940f33a2016-09-08 11:21:54 -0700201 if (handle == -1)
202 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000203
Zachary Ware45520892015-05-13 01:22:32 -0500204 return handle;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000205}
206
207/* Console I/O */
Zachary Ware45520892015-05-13 01:22:32 -0500208/*[clinic input]
209msvcrt.kbhit -> long
Guido van Rossum407a22d1997-08-13 19:57:53 +0000210
Zachary Ware45520892015-05-13 01:22:32 -0500211Return true if a keypress is waiting to be read.
212[clinic start generated code]*/
213
214static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300215msvcrt_kbhit_impl(PyObject *module)
216/*[clinic end generated code: output=940dfce6587c1890 input=e70d678a5c2f6acc]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000217{
Zachary Ware45520892015-05-13 01:22:32 -0500218 return _kbhit();
Guido van Rossum407a22d1997-08-13 19:57:53 +0000219}
220
Zachary Ware45520892015-05-13 01:22:32 -0500221/*[clinic input]
222msvcrt.getch -> byte_char
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000223
Zachary Ware45520892015-05-13 01:22:32 -0500224Read a keypress and return the resulting character as a byte string.
225
226Nothing is echoed to the console. This call will block if a keypress is
227not already available, but will not wait for Enter to be pressed. If the
228pressed key was a special function key, this will return '\000' or
229'\xe0'; the next call will return the keycode. The Control-C keypress
230cannot be read with this function.
231[clinic start generated code]*/
232
233static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300234msvcrt_getch_impl(PyObject *module)
235/*[clinic end generated code: output=a4e51f0565064a7d input=37a40cf0ed0d1153]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 int ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 Py_BEGIN_ALLOW_THREADS
240 ch = _getch();
241 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500242 return ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000243}
244
Zachary Ware45520892015-05-13 01:22:32 -0500245/*[clinic input]
246msvcrt.getwch -> wchar_t
247
248Wide char variant of getch(), returning a Unicode value.
249[clinic start generated code]*/
250
251static wchar_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300252msvcrt_getwch_impl(PyObject *module)
253/*[clinic end generated code: output=be9937494e22f007 input=27b3dec8ad823d7c]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000254{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100255 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 Py_BEGIN_ALLOW_THREADS
258 ch = _getwch();
259 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500260 return ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000261}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000262
Zachary Ware45520892015-05-13 01:22:32 -0500263/*[clinic input]
264msvcrt.getche -> byte_char
Christian Heimes2f1019e2007-12-10 16:18:49 +0000265
Zachary Ware45520892015-05-13 01:22:32 -0500266Similar to getch(), but the keypress will be echoed if possible.
267[clinic start generated code]*/
268
269static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300270msvcrt_getche_impl(PyObject *module)
271/*[clinic end generated code: output=d8f7db4fd2990401 input=43311ade9ed4a9c0]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 int ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 Py_BEGIN_ALLOW_THREADS
276 ch = _getche();
277 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500278 return ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000279}
280
Zachary Ware45520892015-05-13 01:22:32 -0500281/*[clinic input]
282msvcrt.getwche -> wchar_t
283
284Wide char variant of getche(), returning a Unicode value.
285[clinic start generated code]*/
286
287static wchar_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300288msvcrt_getwche_impl(PyObject *module)
289/*[clinic end generated code: output=d0dae5ba3829d596 input=49337d59d1a591f8]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000290{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100291 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 Py_BEGIN_ALLOW_THREADS
294 ch = _getwche();
295 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500296 return ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000297}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000298
Zachary Ware45520892015-05-13 01:22:32 -0500299/*[clinic input]
300msvcrt.putch
301
302 char: char
303 /
304
305Print the byte string char to the console without buffering.
306[clinic start generated code]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000307
308static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300309msvcrt_putch_impl(PyObject *module, char char_value)
310/*[clinic end generated code: output=92ec9b81012d8f60 input=ec078dd10cb054d6]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000311{
Steve Dower21fae032017-02-04 15:05:13 -0800312 _Py_BEGIN_SUPPRESS_IPH
Zachary Ware45520892015-05-13 01:22:32 -0500313 _putch(char_value);
Steve Dower21fae032017-02-04 15:05:13 -0800314 _Py_END_SUPPRESS_IPH
Zachary Ware45520892015-05-13 01:22:32 -0500315 Py_RETURN_NONE;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000316}
317
Zachary Ware45520892015-05-13 01:22:32 -0500318/*[clinic input]
319msvcrt.putwch
320
Zachary Ware77772c02015-05-13 10:58:35 -0500321 unicode_char: int(accept={str})
Zachary Ware45520892015-05-13 01:22:32 -0500322 /
323
324Wide char variant of putch(), accepting a Unicode value.
325[clinic start generated code]*/
326
Christian Heimes2f1019e2007-12-10 16:18:49 +0000327static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300328msvcrt_putwch_impl(PyObject *module, int unicode_char)
329/*[clinic end generated code: output=a3bd1a8951d28eee input=996ccd0bbcbac4c3]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000330{
Steve Dower21fae032017-02-04 15:05:13 -0800331 _Py_BEGIN_SUPPRESS_IPH
Zachary Ware45520892015-05-13 01:22:32 -0500332 _putwch(unicode_char);
Steve Dower21fae032017-02-04 15:05:13 -0800333 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 Py_RETURN_NONE;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000335
336}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000337
Zachary Ware45520892015-05-13 01:22:32 -0500338/*[clinic input]
339msvcrt.ungetch
340
341 char: char
342 /
343
344Opposite of getch.
345
346Cause the byte string char to be "pushed back" into the
347console buffer; it will be the next character read by
348getch() or getche().
349[clinic start generated code]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000350
Tim Peters5fa0bd62000-12-12 01:58:56 +0000351static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300352msvcrt_ungetch_impl(PyObject *module, char char_value)
353/*[clinic end generated code: output=c6942a0efa119000 input=22f07ee9001bbf0f]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000354{
Steve Dower21fae032017-02-04 15:05:13 -0800355 int res;
356
357 _Py_BEGIN_SUPPRESS_IPH
358 res = _ungetch(char_value);
359 _Py_END_SUPPRESS_IPH
360
361 if (res == EOF)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 return PyErr_SetFromErrno(PyExc_IOError);
Zachary Ware45520892015-05-13 01:22:32 -0500363 Py_RETURN_NONE;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000364}
365
Zachary Ware45520892015-05-13 01:22:32 -0500366/*[clinic input]
367msvcrt.ungetwch
368
Zachary Ware77772c02015-05-13 10:58:35 -0500369 unicode_char: int(accept={str})
Zachary Ware45520892015-05-13 01:22:32 -0500370 /
371
372Wide char variant of ungetch(), accepting a Unicode value.
373[clinic start generated code]*/
374
Christian Heimes2f1019e2007-12-10 16:18:49 +0000375static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300376msvcrt_ungetwch_impl(PyObject *module, int unicode_char)
377/*[clinic end generated code: output=e63af05438b8ba3d input=83ec0492be04d564]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000378{
Steve Dower21fae032017-02-04 15:05:13 -0800379 int res;
380
381 _Py_BEGIN_SUPPRESS_IPH
382 res = _ungetwch(unicode_char);
383 _Py_END_SUPPRESS_IPH
384
385 if (res == WEOF)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 return PyErr_SetFromErrno(PyExc_IOError);
Zachary Ware45520892015-05-13 01:22:32 -0500387 Py_RETURN_NONE;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000388}
Tim Peters5fa0bd62000-12-12 01:58:56 +0000389
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000390#ifdef _DEBUG
Zachary Ware45520892015-05-13 01:22:32 -0500391/*[clinic input]
392msvcrt.CrtSetReportFile -> long
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000393
Zachary Ware45520892015-05-13 01:22:32 -0500394 type: int
395 file: int
396 /
397
398Wrapper around _CrtSetReportFile.
399
400Only available on Debug builds.
401[clinic start generated code]*/
402
403static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300404msvcrt_CrtSetReportFile_impl(PyObject *module, int type, int file)
405/*[clinic end generated code: output=df291c7fe032eb68 input=bb8f721a604fcc45]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000406{
Steve Dower21fae032017-02-04 15:05:13 -0800407 long res;
408
409 _Py_BEGIN_SUPPRESS_IPH
410 res = (long)_CrtSetReportFile(type, (_HFILE)file);
411 _Py_END_SUPPRESS_IPH
412
413 return res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000414}
415
Zachary Ware45520892015-05-13 01:22:32 -0500416/*[clinic input]
417msvcrt.CrtSetReportMode -> long
418
419 type: int
420 mode: int
421 /
422
423Wrapper around _CrtSetReportMode.
424
425Only available on Debug builds.
426[clinic start generated code]*/
427
428static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300429msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode)
430/*[clinic end generated code: output=b2863761523de317 input=9319d29b4319426b]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 int res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000433
Steve Dower21fae032017-02-04 15:05:13 -0800434 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 res = _CrtSetReportMode(type, mode);
Steve Dower21fae032017-02-04 15:05:13 -0800436 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 if (res == -1)
Zachary Ware45520892015-05-13 01:22:32 -0500438 PyErr_SetFromErrno(PyExc_IOError);
439 return res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000440}
441
Zachary Ware45520892015-05-13 01:22:32 -0500442/*[clinic input]
443msvcrt.set_error_mode -> long
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000444
Zachary Ware45520892015-05-13 01:22:32 -0500445 mode: int
446 /
447
448Wrapper around _set_error_mode.
449
450Only available on Debug builds.
451[clinic start generated code]*/
452
453static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300454msvcrt_set_error_mode_impl(PyObject *module, int mode)
455/*[clinic end generated code: output=ac4a09040d8ac4e3 input=046fca59c0f20872]*/
Zachary Ware45520892015-05-13 01:22:32 -0500456{
Steve Dower21fae032017-02-04 15:05:13 -0800457 long res;
458
459 _Py_BEGIN_SUPPRESS_IPH
460 res = _set_error_mode(mode);
461 _Py_END_SUPPRESS_IPH
462
463 return res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000464}
Zachary Ware45520892015-05-13 01:22:32 -0500465#endif /* _DEBUG */
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000466
Zachary Ware45520892015-05-13 01:22:32 -0500467/*[clinic input]
468msvcrt.SetErrorMode
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000469
Zachary Ware45520892015-05-13 01:22:32 -0500470 mode: unsigned_int(bitwise=True)
471 /
472
473Wrapper around SetErrorMode.
474[clinic start generated code]*/
475
476static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300477msvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode)
478/*[clinic end generated code: output=01d529293f00da8f input=d8b167258d32d907]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000479{
Zachary Ware45520892015-05-13 01:22:32 -0500480 unsigned int res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000481
Steve Dower21fae032017-02-04 15:05:13 -0800482 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 res = SetErrorMode(mode);
Steve Dower21fae032017-02-04 15:05:13 -0800484 _Py_END_SUPPRESS_IPH
485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 return PyLong_FromUnsignedLong(res);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000487}
488
Zachary Ware45520892015-05-13 01:22:32 -0500489/*[clinic input]
490[clinic start generated code]*/
491/*[clinic end generated code: output=da39a3ee5e6b4b0d input=da39a3ee5e6b4b0d]*/
Tim Peters5fa0bd62000-12-12 01:58:56 +0000492
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000493/* List of functions exported by this module */
494static struct PyMethodDef msvcrt_functions[] = {
Zachary Ware45520892015-05-13 01:22:32 -0500495 MSVCRT_HEAPMIN_METHODDEF
496 MSVCRT_LOCKING_METHODDEF
497 MSVCRT_SETMODE_METHODDEF
498 MSVCRT_OPEN_OSFHANDLE_METHODDEF
499 MSVCRT_GET_OSFHANDLE_METHODDEF
500 MSVCRT_KBHIT_METHODDEF
501 MSVCRT_GETCH_METHODDEF
502 MSVCRT_GETCHE_METHODDEF
503 MSVCRT_PUTCH_METHODDEF
504 MSVCRT_UNGETCH_METHODDEF
505 MSVCRT_SETERRORMODE_METHODDEF
506 MSVCRT_CRTSETREPORTFILE_METHODDEF
507 MSVCRT_CRTSETREPORTMODE_METHODDEF
508 MSVCRT_SET_ERROR_MODE_METHODDEF
509 MSVCRT_GETWCH_METHODDEF
510 MSVCRT_GETWCHE_METHODDEF
511 MSVCRT_PUTWCH_METHODDEF
512 MSVCRT_UNGETWCH_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 {NULL, NULL}
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000514};
515
Martin v. Löwis1a214512008-06-11 05:26:20 +0000516
517static struct PyModuleDef msvcrtmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 PyModuleDef_HEAD_INIT,
519 "msvcrt",
520 NULL,
521 -1,
522 msvcrt_functions,
523 NULL,
524 NULL,
525 NULL,
526 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000527};
528
Zachary Ware45520892015-05-13 01:22:32 -0500529static void
530insertint(PyObject *d, char *name, int value)
531{
532 PyObject *v = PyLong_FromLong((long) value);
533 if (v == NULL) {
534 /* Don't bother reporting this error */
535 PyErr_Clear();
536 }
537 else {
538 PyDict_SetItemString(d, name, v);
539 Py_DECREF(v);
540 }
541}
542
Thomas Hellera18331d2004-07-28 20:02:52 +0000543PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000544PyInit_msvcrt(void)
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 int st;
Brian Curtin401f9f32012-05-13 11:19:23 -0500547 PyObject *d, *version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 PyObject *m = PyModule_Create(&msvcrtmodule);
549 if (m == NULL)
550 return NULL;
551 d = PyModule_GetDict(m);
Tim Peters5fa0bd62000-12-12 01:58:56 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 /* constants for the locking() function's mode argument */
554 insertint(d, "LK_LOCK", _LK_LOCK);
555 insertint(d, "LK_NBLCK", _LK_NBLCK);
556 insertint(d, "LK_NBRLCK", _LK_NBRLCK);
557 insertint(d, "LK_RLCK", _LK_RLCK);
558 insertint(d, "LK_UNLCK", _LK_UNLCK);
559 insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS);
560 insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT);
561 insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX);
562 insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000563#ifdef _DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 insertint(d, "CRT_WARN", _CRT_WARN);
565 insertint(d, "CRT_ERROR", _CRT_ERROR);
566 insertint(d, "CRT_ASSERT", _CRT_ASSERT);
567 insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG);
568 insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE);
569 insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW);
570 insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE);
571 insertint(d, "CRTDBG_FILE_STDERR", (int)_CRTDBG_FILE_STDERR);
572 insertint(d, "CRTDBG_FILE_STDOUT", (int)_CRTDBG_FILE_STDOUT);
573 insertint(d, "CRTDBG_REPORT_FILE", (int)_CRTDBG_REPORT_FILE);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000574#endif
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 /* constants for the crt versions */
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000577#ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
579 _VC_ASSEMBLY_PUBLICKEYTOKEN);
580 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000581#endif
582#ifdef _CRT_ASSEMBLY_VERSION
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
584 _CRT_ASSEMBLY_VERSION);
585 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000586#endif
587#ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
589 __LIBRARIES_ASSEMBLY_NAME_PREFIX);
590 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000591#endif
592
Brian Curtin401f9f32012-05-13 11:19:23 -0500593 /* constants for the 2010 crt versions */
594#if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION)
595 version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION,
596 _VC_CRT_MINOR_VERSION,
597 _VC_CRT_BUILD_VERSION,
598 _VC_CRT_RBUILD_VERSION);
599 st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version);
600 if (st < 0) return NULL;
601#endif
Victor Stinnerba452952015-09-21 22:40:28 +0200602 /* make compiler warning quiet if st is unused */
603 (void)st;
Brian Curtin401f9f32012-05-13 11:19:23 -0500604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 return m;
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000606}