mirror of https://github.com/python/cpython.git
96 lines
2.6 KiB
C
96 lines
2.6 KiB
C
|
/*********************************************************
|
||
|
|
||
|
msvcrtmodule.c
|
||
|
|
||
|
A Python interface to the Microsoft Visual C Runtime
|
||
|
Library, providing access to those non-portable, but
|
||
|
still useful routines.
|
||
|
|
||
|
Only ever compiled with an MS compiler, so no attempt
|
||
|
has been made to avoid MS language extensions, etc...
|
||
|
|
||
|
***********************************************************/
|
||
|
#include "Python.h"
|
||
|
#include "malloc.h"
|
||
|
// Perform locking operations on a file.
|
||
|
static PyObject *msvcrt_locking(PyObject *self, PyObject *args)
|
||
|
{
|
||
|
int mode;
|
||
|
long nBytes;
|
||
|
PyObject *obFile;
|
||
|
FILE *pFile;
|
||
|
if (!PyArg_ParseTuple(args,"O!il:locking", &obFile, PyFile_Type, &mode, &nBytes))
|
||
|
return NULL;
|
||
|
if (NULL==(pFile = PyFile_AsFile(obFile)))
|
||
|
return NULL;
|
||
|
if (0 != _locking(_fileno(pFile), mode, nBytes))
|
||
|
return PyErr_SetFromErrno(PyExc_IOError);
|
||
|
Py_INCREF(Py_None);
|
||
|
return Py_None;
|
||
|
}
|
||
|
|
||
|
// Forces the malloc heap to clean itself up, and free unused blocks
|
||
|
// back to the OS.
|
||
|
static PyObject *msvcrt_heapmin(PyObject *self, PyObject *args)
|
||
|
{
|
||
|
if (!PyArg_ParseTuple(args,":heapmin"))
|
||
|
return NULL;
|
||
|
if (_heapmin()!=0)
|
||
|
return PyErr_SetFromErrno(PyExc_MemoryError); // Is this the correct error???
|
||
|
Py_INCREF(Py_None);
|
||
|
return Py_None;
|
||
|
}
|
||
|
|
||
|
/*******
|
||
|
Left this out for now...
|
||
|
|
||
|
// Convert an OS file handle to a Python file object (yay!).
|
||
|
// This may only work on NT
|
||
|
static PyObject *msvcrt_open_osfhandle(PyObject *self, PyObject *args)
|
||
|
{
|
||
|
// Note that we get the underlying handle using the long
|
||
|
// "abstract" interface. This will allow either a native integer
|
||
|
// or else a Win32 extension PyHANDLE object, which implements an
|
||
|
// int() converter.
|
||
|
PyObject *obHandle;
|
||
|
PyObject *obInt;
|
||
|
int flags;
|
||
|
long handle;
|
||
|
if (!PyArg_ParseTuple(args,"Oi:open_osfhandle", &obHandle, &flags))
|
||
|
return NULL;
|
||
|
|
||
|
if (NULL==(obInt = PyNumber_Int(obHandle))) {
|
||
|
PyErr_Clear();
|
||
|
PyErr_SetString(PyExc_TypeError, "The handle param must be an integer, =
|
||
|
or an object able to be converted to an integer");
|
||
|
return NULL;
|
||
|
}
|
||
|
handle = PyInt_AsLong(obInt);
|
||
|
Py_DECREF(obInt);
|
||
|
rtHandle = _open_osfhandle(handle, flags);
|
||
|
if (rtHandle==-1)
|
||
|
return PyErr_SetFromErrno(PyExc_IOError);
|
||
|
|
||
|
what mode? Should I just return here, and expose _fdopen
|
||
|
and setvbuf?
|
||
|
|
||
|
f1=_fdopen(fd1, "w");
|
||
|
setvbuf(f1, NULL, _IONBF, 0);
|
||
|
f=PyFile_FromFile(f1, cmdstring, "w", fclose);
|
||
|
|
||
|
}
|
||
|
*****/
|
||
|
|
||
|
/* List of functions exported by this module */
|
||
|
static struct PyMethodDef msvcrt_functions[] = {
|
||
|
{"locking", msvcrt_locking, 1},
|
||
|
{"heapmin", msvcrt_heapmin, 1},
|
||
|
{NULL, NULL}
|
||
|
};
|
||
|
|
||
|
__declspec(dllexport) void
|
||
|
initmsvcrt(void)
|
||
|
{
|
||
|
Py_InitModule("msvcrt", msvcrt_functions);
|
||
|
}
|