mirror of
https://github.com/python/cpython.git
synced 2025-12-15 21:44:50 +00:00
bpo-40501: Replace ctypes code in uuid with native module (GH-19948)
This commit is contained in:
parent
f453221c8b
commit
d6b727e2c9
9 changed files with 248 additions and 186 deletions
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Python UUID module that wraps libuuid -
|
||||
* Python UUID module that wraps libuuid or Windows rpcrt4.dll.
|
||||
* DCE compatible Universally Unique Identifier library.
|
||||
*/
|
||||
|
||||
|
|
@ -12,6 +12,12 @@
|
|||
#include <uuid.h>
|
||||
#endif
|
||||
|
||||
#ifdef MS_WINDOWS
|
||||
#include <rpc.h>
|
||||
#endif
|
||||
|
||||
#ifndef MS_WINDOWS
|
||||
|
||||
static PyObject *
|
||||
py_uuid_generate_time_safe(PyObject *Py_UNUSED(context),
|
||||
PyObject *Py_UNUSED(ignored))
|
||||
|
|
@ -31,17 +37,50 @@ py_uuid_generate_time_safe(PyObject *Py_UNUSED(context),
|
|||
return Py_BuildValue("y#i", buf, sizeof(uuid), (int) status);
|
||||
# else
|
||||
return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status);
|
||||
# endif
|
||||
#else
|
||||
# endif /* HAVE_UUID_CREATE */
|
||||
#else /* HAVE_UUID_GENERATE_TIME_SAFE */
|
||||
uuid_generate_time(uuid);
|
||||
return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None);
|
||||
#endif
|
||||
#endif /* HAVE_UUID_GENERATE_TIME_SAFE */
|
||||
}
|
||||
|
||||
#else /* MS_WINDOWS */
|
||||
|
||||
static PyObject *
|
||||
py_UuidCreate(PyObject *Py_UNUSED(context),
|
||||
PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
UUID uuid;
|
||||
RPC_STATUS res;
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
res = UuidCreateSequential(&uuid);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
switch (res) {
|
||||
case RPC_S_OK:
|
||||
case RPC_S_UUID_LOCAL_ONLY:
|
||||
case RPC_S_UUID_NO_ADDRESS:
|
||||
/*
|
||||
All success codes, but the latter two indicate that the UUID is random
|
||||
rather than based on the MAC address. If the OS can't figure this out,
|
||||
neither can we, so we'll take it anyway.
|
||||
*/
|
||||
return Py_BuildValue("y#", (const char *)&uuid, sizeof(uuid));
|
||||
}
|
||||
PyErr_SetFromWindowsErr(res);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* MS_WINDOWS */
|
||||
|
||||
|
||||
static int
|
||||
uuid_exec(PyObject *module) {
|
||||
assert(sizeof(uuid_t) == 16);
|
||||
#ifdef HAVE_UUID_GENERATE_TIME_SAFE
|
||||
#if defined(MS_WINDOWS)
|
||||
int has_uuid_generate_time_safe = 0;
|
||||
#elif defined(HAVE_UUID_GENERATE_TIME_SAFE)
|
||||
int has_uuid_generate_time_safe = 1;
|
||||
#else
|
||||
int has_uuid_generate_time_safe = 0;
|
||||
|
|
@ -54,7 +93,12 @@ uuid_exec(PyObject *module) {
|
|||
}
|
||||
|
||||
static PyMethodDef uuid_methods[] = {
|
||||
#if defined(HAVE_UUID_UUID_H) || defined(HAVE_UUID_H)
|
||||
{"generate_time_safe", py_uuid_generate_time_safe, METH_NOARGS, NULL},
|
||||
#endif
|
||||
#if defined(MS_WINDOWS)
|
||||
{"UuidCreate", py_UuidCreate, METH_NOARGS, NULL},
|
||||
#endif
|
||||
{NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue