blob: 3a0c0573826692175b6e944717913db3ccb80613 [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);
22#elif 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);
25 return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status);
Victor Stinner4337a0d2017-10-02 07:57:59 -070026#else
Michael Felt0d3ccb42017-12-30 22:39:20 +010027 uuid_generate_time(uuid);
28 return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None);
Victor Stinner4337a0d2017-10-02 07:57:59 -070029#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020030}
31
32
33static PyMethodDef uuid_methods[] = {
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053034 {"generate_time_safe", py_uuid_generate_time_safe, METH_NOARGS, NULL},
Antoine Pitroua106aec2017-09-28 23:03:06 +020035 {NULL, NULL, 0, NULL} /* sentinel */
36};
37
38static struct PyModuleDef uuidmodule = {
39 PyModuleDef_HEAD_INIT,
40 .m_name = "_uuid",
41 .m_size = -1,
42 .m_methods = uuid_methods,
43};
44
45PyMODINIT_FUNC
46PyInit__uuid(void)
47{
Victor Stinner4337a0d2017-10-02 07:57:59 -070048 PyObject *mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020049 assert(sizeof(uuid_t) == 16);
Berker Peksag9a10ff42017-11-08 23:09:16 +030050#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Victor Stinner4337a0d2017-10-02 07:57:59 -070051 int has_uuid_generate_time_safe = 1;
52#else
53 int has_uuid_generate_time_safe = 0;
54#endif
55 mod = PyModule_Create(&uuidmodule);
56 if (mod == NULL) {
57 return NULL;
58 }
59 if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe",
60 has_uuid_generate_time_safe) < 0) {
61 return NULL;
62 }
63
64 return mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020065}