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 pass
elif _uuid is not None: elif _uuid is not None:
_generate_time_safe = _uuid.generate_time_safe _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 return
try: try:

View File

@ -4,14 +4,27 @@
#include <uuid/uuid.h> #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 * static PyObject *
py_uuid_generate_time_safe(void) py_uuid_generate_time_safe(void)
{ {
#ifdef HAVE_TIME_SAFE
uuid_t out; uuid_t out;
int res; int res;
res = uuid_generate_time_safe(out); res = uuid_generate_time_safe(out);
return Py_BuildValue("y#i", (const char *) out, sizeof(out), res); 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 PyMODINIT_FUNC
PyInit__uuid(void) PyInit__uuid(void)
{ {
PyObject *mod;
assert(sizeof(uuid_t) == 16); 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;
} }