]> git.ipfire.org Git - people/ms/libloc.git/blame - src/python/locationmodule.c
python: Avoid declaring loc_ctx multiple times
[people/ms/libloc.git] / src / python / locationmodule.c
CommitLineData
18e2b14c
MT
1/*
2 libloc - A library to determine the location of someone on the Internet
3
4 Copyright (C) 2017 IPFire Development Team <info@ipfire.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15*/
16
17#include <Python.h>
c941dd31 18#include <syslog.h>
18e2b14c 19
62ffafdd 20#include "locationmodule.h"
fadebc89 21#include "as.h"
9cdf6c53 22#include "database.h"
39967361 23#include "network.h"
d688e569 24#include "writer.h"
9cdf6c53 25
51173f45
MT
26/* Declare global context */
27struct loc_ctx* loc_ctx;
28
18e2b14c
MT
29PyMODINIT_FUNC PyInit_location(void);
30
62ffafdd
MT
31static void location_free(void) {
32 // Release context
33 if (loc_ctx)
34 loc_unref(loc_ctx);
35}
36
c941dd31
MT
37static PyObject* set_log_level(PyObject* m, PyObject* args) {
38 int priority = LOG_INFO;
39
40 if (!PyArg_ParseTuple(args, "i", &priority))
41 return NULL;
42
43 loc_set_log_priority(loc_ctx, priority);
44
45 Py_RETURN_NONE;
46}
47
18e2b14c 48static PyMethodDef location_module_methods[] = {
c941dd31
MT
49 {
50 "set_log_level",
51 (PyCFunction)set_log_level,
52 METH_VARARGS,
53 NULL,
54 },
18e2b14c
MT
55 { NULL },
56};
57
58static struct PyModuleDef location_module = {
59 .m_base = PyModuleDef_HEAD_INIT,
60 .m_name = "location",
61 .m_size = -1,
62 .m_doc = "Python module for libloc",
63 .m_methods = location_module_methods,
62ffafdd 64 .m_free = (freefunc)location_free,
18e2b14c
MT
65};
66
67PyMODINIT_FUNC PyInit_location(void) {
62ffafdd
MT
68 // Initialise loc context
69 int r = loc_new(&loc_ctx);
70 if (r)
71 return NULL;
72
18e2b14c
MT
73 PyObject* m = PyModule_Create(&location_module);
74 if (!m)
75 return NULL;
76
fadebc89
MT
77 // AS
78 if (PyType_Ready(&ASType) < 0)
79 return NULL;
80
81 Py_INCREF(&ASType);
82 PyModule_AddObject(m, "AS", (PyObject *)&ASType);
83
9cdf6c53
MT
84 // Database
85 if (PyType_Ready(&DatabaseType) < 0)
86 return NULL;
87
88 Py_INCREF(&DatabaseType);
89 PyModule_AddObject(m, "Database", (PyObject *)&DatabaseType);
90
afb426df
MT
91 // Database Enumerator
92 if (PyType_Ready(&DatabaseEnumeratorType) < 0)
93 return NULL;
94
95 Py_INCREF(&DatabaseEnumeratorType);
96 //PyModule_AddObject(m, "DatabaseEnumerator", (PyObject *)&DatabaseEnumeratorType);
97
39967361
MT
98 // Network
99 if (PyType_Ready(&NetworkType) < 0)
100 return NULL;
101
102 Py_INCREF(&NetworkType);
103 PyModule_AddObject(m, "Network", (PyObject *)&NetworkType);
104
d688e569
MT
105 // Writer
106 if (PyType_Ready(&WriterType) < 0)
107 return NULL;
108
109 Py_INCREF(&WriterType);
110 PyModule_AddObject(m, "Writer", (PyObject *)&WriterType);
111
ddb184be
MT
112 // Add constants
113 PyObject* d = PyModule_GetDict(m);
114
115 // Version
116 PyDict_SetItemString(d, "__version__", PyUnicode_FromString(VERSION));
117
18e2b14c
MT
118 return m;
119}