blob: 5afa45f9c30a35ac301809a2dfab1b7b754f3024 [file] [log] [blame]
Guido van Rossum29c1ea51997-08-07 00:11:34 +00001/*********************************************************
2
3 msvcrtmodule.c
4
5 A Python interface to the Microsoft Visual C Runtime
6 Library, providing access to those non-portable, but
7 still useful routines.
8
9 Only ever compiled with an MS compiler, so no attempt
10 has been made to avoid MS language extensions, etc...
11
Guido van Rossum407a22d1997-08-13 19:57:53 +000012 This may only work on NT or 95...
13
14 Author: Mark Hammond and Guido van Rossum.
15 Maintenance: Guido van Rossum.
16
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>
Guido van Rossum29c1ea51997-08-07 00:11:34 +000024
Guido van Rossum407a22d1997-08-13 19:57:53 +000025// Force the malloc heap to clean itself up, and free unused blocks
26// back to the OS. (According to the docs, only works on NT.)
Tim Peters5fa0bd62000-12-12 01:58:56 +000027static PyObject *
28msvcrt_heapmin(PyObject *self, PyObject *args)
Guido van Rossum29c1ea51997-08-07 00:11:34 +000029{
Guido van Rossum407a22d1997-08-13 19:57:53 +000030 if (!PyArg_ParseTuple(args, ":heapmin"))
Guido van Rossum29c1ea51997-08-07 00:11:34 +000031 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +000032
33 if (_heapmin() != 0)
34 return PyErr_SetFromErrno(PyExc_IOError);
35
Guido van Rossum29c1ea51997-08-07 00:11:34 +000036 Py_INCREF(Py_None);
37 return Py_None;
38}
39
Guido van Rossum407a22d1997-08-13 19:57:53 +000040// Perform locking operations on a C runtime file descriptor.
Tim Peters5fa0bd62000-12-12 01:58:56 +000041static PyObject *
42msvcrt_locking(PyObject *self, PyObject *args)
Guido van Rossum29c1ea51997-08-07 00:11:34 +000043{
Guido van Rossum407a22d1997-08-13 19:57:53 +000044 int fd;
45 int mode;
46 long nbytes;
Guido van Rossume4e021b1998-05-29 01:27:07 +000047 int err;
Guido van Rossum407a22d1997-08-13 19:57:53 +000048
49 if (!PyArg_ParseTuple(args, "iil:locking", &fd, &mode, &nbytes))
Guido van Rossum29c1ea51997-08-07 00:11:34 +000050 return NULL;
51
Guido van Rossume4e021b1998-05-29 01:27:07 +000052 Py_BEGIN_ALLOW_THREADS
53 err = _locking(fd, mode, nbytes);
54 Py_END_ALLOW_THREADS
55 if (err != 0)
Guido van Rossum29c1ea51997-08-07 00:11:34 +000056 return PyErr_SetFromErrno(PyExc_IOError);
57
Guido van Rossum407a22d1997-08-13 19:57:53 +000058 Py_INCREF(Py_None);
59 return Py_None;
Guido van Rossum29c1ea51997-08-07 00:11:34 +000060}
Guido van Rossum407a22d1997-08-13 19:57:53 +000061
62// Set the file translation mode for a C runtime file descriptor.
Tim Peters5fa0bd62000-12-12 01:58:56 +000063static PyObject *
64msvcrt_setmode(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +000065{
66 int fd;
67 int flags;
68 if (!PyArg_ParseTuple(args,"ii:setmode", &fd, &flags))
69 return NULL;
70
71 flags = _setmode(fd, flags);
72 if (flags == -1)
73 return PyErr_SetFromErrno(PyExc_IOError);
74
75 return PyInt_FromLong(flags);
76}
77
78// Convert an OS file handle to a C runtime file descriptor.
Tim Peters5fa0bd62000-12-12 01:58:56 +000079static PyObject *
80msvcrt_open_osfhandle(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +000081{
82 long handle;
83 int flags;
84 int fd;
85
86 if (!PyArg_ParseTuple(args, "li:open_osfhandle", &handle, &flags))
Guido van Rossume4e021b1998-05-29 01:27:07 +000087 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +000088
89 fd = _open_osfhandle(handle, flags);
90 if (fd == -1)
91 return PyErr_SetFromErrno(PyExc_IOError);
92
93 return PyInt_FromLong(fd);
94}
95
96// Convert a C runtime file descriptor to an OS file handle.
Tim Peters5fa0bd62000-12-12 01:58:56 +000097static PyObject *
98msvcrt_get_osfhandle(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +000099{
100 int fd;
Tim Peters79248aa2001-08-29 21:37:10 +0000101 Py_intptr_t handle;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000102
103 if (!PyArg_ParseTuple(args,"i:get_osfhandle", &fd))
104 return NULL;
105
106 handle = _get_osfhandle(fd);
107 if (handle == -1)
108 return PyErr_SetFromErrno(PyExc_IOError);
109
Fred Drake25e17262000-06-30 17:48:51 +0000110 /* technically 'handle' is not a pointer, but a integer as
111 large as a pointer, Python's *VoidPtr interface is the
112 most appropriate here */
113 return PyLong_FromVoidPtr((void*)handle);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000114}
115
116/* Console I/O */
Guido van Rossum407a22d1997-08-13 19:57:53 +0000117
Tim Peters5fa0bd62000-12-12 01:58:56 +0000118static PyObject *
119msvcrt_kbhit(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000120{
121 int ok;
122
123 if (!PyArg_ParseTuple(args, ":kbhit"))
124 return NULL;
125
126 ok = _kbhit();
127 return PyInt_FromLong(ok);
128}
129
Tim Peters5fa0bd62000-12-12 01:58:56 +0000130static PyObject *
131msvcrt_getch(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000132{
133 int ch;
134 char s[1];
135
136 if (!PyArg_ParseTuple(args, ":getch"))
137 return NULL;
138
Guido van Rossume4e021b1998-05-29 01:27:07 +0000139 Py_BEGIN_ALLOW_THREADS
Guido van Rossum407a22d1997-08-13 19:57:53 +0000140 ch = _getch();
Guido van Rossume4e021b1998-05-29 01:27:07 +0000141 Py_END_ALLOW_THREADS
Guido van Rossum407a22d1997-08-13 19:57:53 +0000142 s[0] = ch;
143 return PyString_FromStringAndSize(s, 1);
144}
145
Tim Peters5fa0bd62000-12-12 01:58:56 +0000146static PyObject *
147msvcrt_getche(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000148{
149 int ch;
150 char s[1];
151
152 if (!PyArg_ParseTuple(args, ":getche"))
153 return NULL;
154
Guido van Rossume4e021b1998-05-29 01:27:07 +0000155 Py_BEGIN_ALLOW_THREADS
Guido van Rossum407a22d1997-08-13 19:57:53 +0000156 ch = _getche();
Guido van Rossume4e021b1998-05-29 01:27:07 +0000157 Py_END_ALLOW_THREADS
Guido van Rossum407a22d1997-08-13 19:57:53 +0000158 s[0] = ch;
159 return PyString_FromStringAndSize(s, 1);
160}
161
Tim Peters5fa0bd62000-12-12 01:58:56 +0000162static PyObject *
163msvcrt_putch(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000164{
165 char ch;
166
167 if (!PyArg_ParseTuple(args, "c:putch", &ch))
168 return NULL;
169
170 _putch(ch);
171 Py_INCREF(Py_None);
172 return Py_None;
173}
174
Tim Peters5fa0bd62000-12-12 01:58:56 +0000175static PyObject *
176msvcrt_ungetch(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000177{
178 char ch;
179
180 if (!PyArg_ParseTuple(args, "c:ungetch", &ch))
181 return NULL;
182
Guido van Rossum6543e881999-02-16 19:40:02 +0000183 if (_ungetch(ch) == EOF)
184 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000185 Py_INCREF(Py_None);
186 return Py_None;
187}
188
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000189
Tim Peters5fa0bd62000-12-12 01:58:56 +0000190static void
191insertint(PyObject *d, char *name, int value)
192{
193 PyObject *v = PyInt_FromLong((long) value);
194 if (v == NULL) {
195 /* Don't bother reporting this error */
196 PyErr_Clear();
197 }
198 else {
199 PyDict_SetItemString(d, name, v);
200 Py_DECREF(v);
201 }
202}
203
204
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000205/* List of functions exported by this module */
206static struct PyMethodDef msvcrt_functions[] = {
Neal Norwitz031829d2002-03-31 14:37:44 +0000207 {"heapmin", msvcrt_heapmin, METH_VARARGS},
208 {"locking", msvcrt_locking, METH_VARARGS},
209 {"setmode", msvcrt_setmode, METH_VARARGS},
210 {"open_osfhandle", msvcrt_open_osfhandle, METH_VARARGS},
211 {"get_osfhandle", msvcrt_get_osfhandle, METH_VARARGS},
212 {"kbhit", msvcrt_kbhit, METH_VARARGS},
213 {"getch", msvcrt_getch, METH_VARARGS},
214 {"getche", msvcrt_getche, METH_VARARGS},
215 {"putch", msvcrt_putch, METH_VARARGS},
216 {"ungetch", msvcrt_ungetch, METH_VARARGS},
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000217 {NULL, NULL}
218};
219
220__declspec(dllexport) void
221initmsvcrt(void)
222{
Tim Peters5fa0bd62000-12-12 01:58:56 +0000223 PyObject *m = Py_InitModule("msvcrt", msvcrt_functions);
224 PyObject *d = PyModule_GetDict(m);
225
226 /* constants for the locking() function's mode argument */
227 insertint(d, "LK_LOCK", _LK_LOCK);
228 insertint(d, "LK_NBLCK", _LK_NBLCK);
229 insertint(d, "LK_NBRLCK", _LK_NBRLCK);
230 insertint(d, "LK_RLCK", _LK_RLCK);
231 insertint(d, "LK_UNLCK", _LK_UNLCK);
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000232}