blob: 16aa09b04ff2090453df0b13ceab3c7c4666b7ce [file] [log] [blame]
Antoine Pitroua106aec2017-09-28 23:03:06 +02001#define PY_SSIZE_T_CLEAN
2
3#include "Python.h"
Michael Felt0d3ccb42017-12-30 22:39:20 +01004#ifdef HAVE_UUID_UUID_H
Antoine Pitroua106aec2017-09-28 23:03:06 +02005#include <uuid/uuid.h>
Michael Felt0d3ccb42017-12-30 22:39:20 +01006#endif
7#ifdef HAVE_UUID_H
8#include <uuid.h>
9#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020010
11
12static PyObject *
13py_uuid_generate_time_safe(void)
14{
Michael Felt0d3ccb42017-12-30 22:39:20 +010015 uuid_t uuid;
Berker Peksag9a10ff42017-11-08 23:09:16 +030016#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Antoine Pitroua106aec2017-09-28 23:03:06 +020017 int res;
18
Michael Felt0d3ccb42017-12-30 22:39:20 +010019 res = uuid_generate_time_safe(uuid);
20 return Py_BuildValue("y#i", (const char *) uuid, sizeof(uuid), res);
21#elif HAVE_UUID_CREATE
David Carlierb4ebaa72018-01-09 19:38:07 +000022 uint32_t status;
Michael Felt0d3ccb42017-12-30 22:39:20 +010023 uuid_create(&uuid, &status);
24 return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status);
Victor Stinner4337a0d2017-10-02 07:57:59 -070025#else
Michael Felt0d3ccb42017-12-30 22:39:20 +010026 uuid_generate_time(uuid);
27 return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None);
Victor Stinner4337a0d2017-10-02 07:57:59 -070028#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020029}
30
31
32static PyMethodDef uuid_methods[] = {
33 {"generate_time_safe", (PyCFunction) py_uuid_generate_time_safe, METH_NOARGS, NULL},
34 {NULL, NULL, 0, NULL} /* sentinel */
35};
36
37static struct PyModuleDef uuidmodule = {
38 PyModuleDef_HEAD_INIT,
39 .m_name = "_uuid",
40 .m_size = -1,
41 .m_methods = uuid_methods,
42};
43
44PyMODINIT_FUNC
45PyInit__uuid(void)
46{
Victor Stinner4337a0d2017-10-02 07:57:59 -070047 PyObject *mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020048 assert(sizeof(uuid_t) == 16);
Berker Peksag9a10ff42017-11-08 23:09:16 +030049#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Victor Stinner4337a0d2017-10-02 07:57:59 -070050 int has_uuid_generate_time_safe = 1;
51#else
52 int has_uuid_generate_time_safe = 0;
53#endif
54 mod = PyModule_Create(&uuidmodule);
55 if (mod == NULL) {
56 return NULL;
57 }
58 if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe",
59 has_uuid_generate_time_safe) < 0) {
60 return NULL;
61 }
62
63 return mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020064}