blob: 88c40ce353786e40c464de373675297fdd9f5af1 [file] [log] [blame]
Antoine Pitroua106aec2017-09-28 23:03:06 +02001#define PY_SSIZE_T_CLEAN
2
3#include "Python.h"
4#include <uuid/uuid.h>
5
6
Victor Stinner4337a0d2017-10-02 07:57:59 -07007/* bpo-11063: libuuid on macOS doesn't provide uuid_generate_time_safe(),
8 only uuid_generate_time(). */
9#ifndef __APPLE__
10# define HAVE_TIME_SAFE
11#endif
12
13
Antoine Pitroua106aec2017-09-28 23:03:06 +020014static PyObject *
15py_uuid_generate_time_safe(void)
16{
Victor Stinner4337a0d2017-10-02 07:57:59 -070017#ifdef HAVE_TIME_SAFE
Antoine Pitroua106aec2017-09-28 23:03:06 +020018 uuid_t out;
19 int res;
20
21 res = uuid_generate_time_safe(out);
22 return Py_BuildValue("y#i", (const char *) out, sizeof(out), res);
Victor Stinner4337a0d2017-10-02 07:57:59 -070023#else
24 uuid_t out;
25 uuid_generate_time(out);
26 return Py_BuildValue("y#O", (const char *) out, sizeof(out), Py_None);
27#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020028}
29
30
31static PyMethodDef uuid_methods[] = {
32 {"generate_time_safe", (PyCFunction) py_uuid_generate_time_safe, METH_NOARGS, NULL},
33 {NULL, NULL, 0, NULL} /* sentinel */
34};
35
36static struct PyModuleDef uuidmodule = {
37 PyModuleDef_HEAD_INIT,
38 .m_name = "_uuid",
39 .m_size = -1,
40 .m_methods = uuid_methods,
41};
42
43PyMODINIT_FUNC
44PyInit__uuid(void)
45{
Victor Stinner4337a0d2017-10-02 07:57:59 -070046 PyObject *mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020047 assert(sizeof(uuid_t) == 16);
Victor Stinner4337a0d2017-10-02 07:57:59 -070048#ifdef HAVE_TIME_SAFE
49 int has_uuid_generate_time_safe = 1;
50#else
51 int has_uuid_generate_time_safe = 0;
52#endif
53 mod = PyModule_Create(&uuidmodule);
54 if (mod == NULL) {
55 return NULL;
56 }
57 if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe",
58 has_uuid_generate_time_safe) < 0) {
59 return NULL;
60 }
61
62 return mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020063}