blob: 0b7aa72e91a1c9cb5893eb7d988875f5a2029066 [file] [log] [blame]
ziheng6ffd9b02019-06-25 01:59:51 +08001/*
2 * Python UUID module that wraps libuuid -
3 * DCE compatible Universally Unique Identifier library.
4 */
5
Antoine Pitroua106aec2017-09-28 23:03:06 +02006#define PY_SSIZE_T_CLEAN
7
8#include "Python.h"
Michael Felt0d3ccb42017-12-30 22:39:20 +01009#ifdef HAVE_UUID_UUID_H
Antoine Pitroua106aec2017-09-28 23:03:06 +020010#include <uuid/uuid.h>
ziheng6ffd9b02019-06-25 01:59:51 +080011#elif defined(HAVE_UUID_H)
Michael Felt0d3ccb42017-12-30 22:39:20 +010012#include <uuid.h>
13#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020014
Antoine Pitroua106aec2017-09-28 23:03:06 +020015static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053016py_uuid_generate_time_safe(PyObject *Py_UNUSED(context),
17 PyObject *Py_UNUSED(ignored))
Antoine Pitroua106aec2017-09-28 23:03:06 +020018{
Michael Felt0d3ccb42017-12-30 22:39:20 +010019 uuid_t uuid;
Berker Peksag9a10ff42017-11-08 23:09:16 +030020#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Antoine Pitroua106aec2017-09-28 23:03:06 +020021 int res;
22
Michael Felt0d3ccb42017-12-30 22:39:20 +010023 res = uuid_generate_time_safe(uuid);
24 return Py_BuildValue("y#i", (const char *) uuid, sizeof(uuid), res);
Serhiy Storchaka17d88302018-05-25 01:45:09 +030025#elif defined(HAVE_UUID_CREATE)
David Carlierb4ebaa72018-01-09 19:38:07 +000026 uint32_t status;
Michael Felt0d3ccb42017-12-30 22:39:20 +010027 uuid_create(&uuid, &status);
Serhiy Storchaka17d88302018-05-25 01:45:09 +030028# if defined(HAVE_UUID_ENC_BE)
29 unsigned char buf[sizeof(uuid)];
30 uuid_enc_be(buf, &uuid);
31 return Py_BuildValue("y#i", buf, sizeof(uuid), (int) status);
32# else
Michael Felt0d3ccb42017-12-30 22:39:20 +010033 return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status);
Serhiy Storchaka17d88302018-05-25 01:45:09 +030034# endif
Victor Stinner4337a0d2017-10-02 07:57:59 -070035#else
Michael Felt0d3ccb42017-12-30 22:39:20 +010036 uuid_generate_time(uuid);
37 return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None);
Victor Stinner4337a0d2017-10-02 07:57:59 -070038#endif
Antoine Pitroua106aec2017-09-28 23:03:06 +020039}
40
41
42static PyMethodDef uuid_methods[] = {
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053043 {"generate_time_safe", py_uuid_generate_time_safe, METH_NOARGS, NULL},
Antoine Pitroua106aec2017-09-28 23:03:06 +020044 {NULL, NULL, 0, NULL} /* sentinel */
45};
46
47static struct PyModuleDef uuidmodule = {
48 PyModuleDef_HEAD_INIT,
49 .m_name = "_uuid",
50 .m_size = -1,
51 .m_methods = uuid_methods,
52};
53
54PyMODINIT_FUNC
55PyInit__uuid(void)
56{
Victor Stinner4337a0d2017-10-02 07:57:59 -070057 PyObject *mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020058 assert(sizeof(uuid_t) == 16);
Berker Peksag9a10ff42017-11-08 23:09:16 +030059#ifdef HAVE_UUID_GENERATE_TIME_SAFE
Victor Stinner4337a0d2017-10-02 07:57:59 -070060 int has_uuid_generate_time_safe = 1;
61#else
62 int has_uuid_generate_time_safe = 0;
63#endif
64 mod = PyModule_Create(&uuidmodule);
65 if (mod == NULL) {
66 return NULL;
67 }
68 if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe",
69 has_uuid_generate_time_safe) < 0) {
Serhiy Storchaka17d88302018-05-25 01:45:09 +030070 Py_DECREF(mod);
Victor Stinner4337a0d2017-10-02 07:57:59 -070071 return NULL;
72 }
73
74 return mod;
Antoine Pitroua106aec2017-09-28 23:03:06 +020075}