bpo-11063: Fix _uuid module on macOS (#3855)

On macOS, use uuid_generate_time() instead of
uuid_generate_time_safe() of libuuid, since uuid_generate_time_safe()
is not available.
This commit is contained in:
Victor Stinner 2017-10-02 07:57:59 -07:00 committed by GitHub
parent 1023dbbcb7
commit 4337a0d995
2 changed files with 30 additions and 2 deletions

View File

@ -509,7 +509,7 @@ def _load_system_functions():
pass
elif _uuid is not None:
_generate_time_safe = _uuid.generate_time_safe
_has_uuid_generate_time_safe = True
_has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe
return
try:

View File

@ -4,14 +4,27 @@
#include <uuid/uuid.h>
/* bpo-11063: libuuid on macOS doesn't provide uuid_generate_time_safe(),
only uuid_generate_time(). */
#ifndef __APPLE__
# define HAVE_TIME_SAFE
#endif
static PyObject *
py_uuid_generate_time_safe(void)
{
#ifdef HAVE_TIME_SAFE
uuid_t out;
int res;
res = uuid_generate_time_safe(out);
return Py_BuildValue("y#i", (const char *) out, sizeof(out), res);
#else
uuid_t out;
uuid_generate_time(out);
return Py_BuildValue("y#O", (const char *) out, sizeof(out), Py_None);
#endif
}
@ -30,6 +43,21 @@ static struct PyModuleDef uuidmodule = {
PyMODINIT_FUNC
PyInit__uuid(void)
{
PyObject *mod;
assert(sizeof(uuid_t) == 16);
return PyModule_Create(&uuidmodule);
#ifdef HAVE_TIME_SAFE
int has_uuid_generate_time_safe = 1;
#else
int has_uuid_generate_time_safe = 0;
#endif
mod = PyModule_Create(&uuidmodule);
if (mod == NULL) {
return NULL;
}
if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe",
has_uuid_generate_time_safe) < 0) {
return NULL;
}
return mod;
}