blob: d4bc3c7b0d4be8e7efe9a0dd9dfdc82c413c8f2a [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
7static PyObject *
8py_uuid_generate_time_safe(void)
9{
Berker Peksag9a10ff42017-11-08 23:09:16 +030010#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Antoine Pitroua106aec2017-09-28 23:03:06 +020011 uuid_t out;
12 int res;
13
14 res = uuid_generate_time_safe(out);
15 return Py_BuildValue("y#i", (const char *) out, sizeof(out), res);
Victor Stinner4337a0d2017-10-02 07:57:59 -070016#else
17 uuid_t out;
18 uuid_generate_time(out);
19 return Py_BuildValue("y#O", (const char *) out, sizeof(out), Py_None);
20#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020021}
22
23
24static PyMethodDef uuid_methods[] = {
25 {"generate_time_safe", (PyCFunction) py_uuid_generate_time_safe, METH_NOARGS, NULL},
26 {NULL, NULL, 0, NULL} /* sentinel */
27};
28
29static struct PyModuleDef uuidmodule = {
30 PyModuleDef_HEAD_INIT,
31 .m_name = "_uuid",
32 .m_size = -1,
33 .m_methods = uuid_methods,
34};
35
36PyMODINIT_FUNC
37PyInit__uuid(void)
38{
Victor Stinner4337a0d2017-10-02 07:57:59 -070039 PyObject *mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020040 assert(sizeof(uuid_t) == 16);
Berker Peksag9a10ff42017-11-08 23:09:16 +030041#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Victor Stinner4337a0d2017-10-02 07:57:59 -070042 int has_uuid_generate_time_safe = 1;
43#else
44 int has_uuid_generate_time_safe = 0;
45#endif
46 mod = PyModule_Create(&uuidmodule);
47 if (mod == NULL) {
48 return NULL;
49 }
50 if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe",
51 has_uuid_generate_time_safe) < 0) {
52 return NULL;
53 }
54
55 return mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020056}