blob: 0b7f2a2545d4ebeb354de751ccbb5caf9bd02030 [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 *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053013py_uuid_generate_time_safe(PyObject *Py_UNUSED(context),
14 PyObject *Py_UNUSED(ignored))
Antoine Pitroua106aec2017-09-28 23:03:06 +020015{
Michael Felt0d3ccb42017-12-30 22:39:20 +010016 uuid_t uuid;
Berker Peksag9a10ff42017-11-08 23:09:16 +030017#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Antoine Pitroua106aec2017-09-28 23:03:06 +020018 int res;
19
Michael Felt0d3ccb42017-12-30 22:39:20 +010020 res = uuid_generate_time_safe(uuid);
21 return Py_BuildValue("y#i", (const char *) uuid, sizeof(uuid), res);
Serhiy Storchaka17d88302018-05-25 01:45:09 +030022#elif defined(HAVE_UUID_CREATE)
David Carlierb4ebaa72018-01-09 19:38:07 +000023 uint32_t status;
Michael Felt0d3ccb42017-12-30 22:39:20 +010024 uuid_create(&uuid, &status);
Serhiy Storchaka17d88302018-05-25 01:45:09 +030025# if defined(HAVE_UUID_ENC_BE)
26 unsigned char buf[sizeof(uuid)];
27 uuid_enc_be(buf, &uuid);
28 return Py_BuildValue("y#i", buf, sizeof(uuid), (int) status);
29# else
Michael Felt0d3ccb42017-12-30 22:39:20 +010030 return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status);
Serhiy Storchaka17d88302018-05-25 01:45:09 +030031# endif
Victor Stinner4337a0d2017-10-02 07:57:59 -070032#else
Michael Felt0d3ccb42017-12-30 22:39:20 +010033 uuid_generate_time(uuid);
34 return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None);
Victor Stinner4337a0d2017-10-02 07:57:59 -070035#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020036}
37
38
39static PyMethodDef uuid_methods[] = {
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053040 {"generate_time_safe", py_uuid_generate_time_safe, METH_NOARGS, NULL},
Antoine Pitroua106aec2017-09-28 23:03:06 +020041 {NULL, NULL, 0, NULL} /* sentinel */
42};
43
44static struct PyModuleDef uuidmodule = {
45 PyModuleDef_HEAD_INIT,
46 .m_name = "_uuid",
47 .m_size = -1,
48 .m_methods = uuid_methods,
49};
50
51PyMODINIT_FUNC
52PyInit__uuid(void)
53{
Victor Stinner4337a0d2017-10-02 07:57:59 -070054 PyObject *mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020055 assert(sizeof(uuid_t) == 16);
Berker Peksag9a10ff42017-11-08 23:09:16 +030056#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Victor Stinner4337a0d2017-10-02 07:57:59 -070057 int has_uuid_generate_time_safe = 1;
58#else
59 int has_uuid_generate_time_safe = 0;
60#endif
61 mod = PyModule_Create(&uuidmodule);
62 if (mod == NULL) {
63 return NULL;
64 }
65 if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe",
66 has_uuid_generate_time_safe) < 0) {
Serhiy Storchaka17d88302018-05-25 01:45:09 +030067 Py_DECREF(mod);
Victor Stinner4337a0d2017-10-02 07:57:59 -070068 return NULL;
69 }
70
71 return mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020072}