2 libloc - A library to determine the location of someone on the Internet
4 Copyright (C) 2017 IPFire Development Team <info@ipfire.org>
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.
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.
19 #include <loc/libloc.h>
20 #include <loc/database.h>
22 #include "locationmodule.h"
27 static PyObject
* Database_new(PyTypeObject
* type
, PyObject
* args
, PyObject
* kwds
) {
28 DatabaseObject
* self
= (DatabaseObject
*)type
->tp_alloc(type
, 0);
30 return (PyObject
*)self
;
33 static void Database_dealloc(DatabaseObject
* self
) {
35 loc_database_unref(self
->db
);
40 Py_TYPE(self
)->tp_free((PyObject
* )self
);
43 static int Database_init(DatabaseObject
* self
, PyObject
* args
, PyObject
* kwargs
) {
44 const char* path
= NULL
;
46 if (!PyArg_ParseTuple(args
, "s", &path
))
49 self
->path
= strdup(path
);
51 // Open the file for reading
52 FILE* f
= fopen(self
->path
, "r");
54 PyErr_SetFromErrno(PyExc_IOError
);
59 int r
= loc_database_new(loc_ctx
, &self
->db
, f
);
62 // Return on any errors
69 static PyObject
* Database_repr(DatabaseObject
* self
) {
70 return PyUnicode_FromFormat("<Database %s>", self
->path
);
73 static PyObject
* Database_get_description(DatabaseObject
* self
) {
74 const char* description
= loc_database_get_description(self
->db
);
76 return PyUnicode_FromString(description
);
79 static PyObject
* Database_get_vendor(DatabaseObject
* self
) {
80 const char* vendor
= loc_database_get_vendor(self
->db
);
82 return PyUnicode_FromString(vendor
);
85 static PyObject
* Database_get_license(DatabaseObject
* self
) {
86 const char* license
= loc_database_get_license(self
->db
);
88 return PyUnicode_FromString(license
);
91 static PyObject
* Database_get_created_at(DatabaseObject
* self
) {
92 time_t created_at
= loc_database_created_at(self
->db
);
94 return PyLong_FromLong(created_at
);
97 static PyObject
* Database_get_as(DatabaseObject
* self
, PyObject
* args
) {
98 struct loc_as
* as
= NULL
;
101 if (!PyArg_ParseTuple(args
, "i", &number
))
104 // Try to retrieve the AS
105 int r
= loc_database_get_as(self
->db
, &as
, number
);
109 PyObject
* obj
= new_as(&ASType
, as
);
123 static PyObject
* Database_lookup(DatabaseObject
* self
, PyObject
* args
) {
124 struct loc_network
* network
= NULL
;
125 const char* address
= NULL
;
127 if (!PyArg_ParseTuple(args
, "s", &address
))
130 // Try to retrieve a matching network
131 int r
= loc_database_lookup_from_string(self
->db
, address
, &network
);
135 PyObject
* obj
= new_network(&NetworkType
, network
);
136 loc_network_unref(network
);
145 } else if (r
== -EINVAL
) {
146 PyErr_Format(PyExc_ValueError
, "Invalid IP address: %s", address
);
154 static PyObject
* new_database_enumerator(PyTypeObject
* type
, struct loc_database_enumerator
* enumerator
) {
155 DatabaseEnumeratorObject
* self
= (DatabaseEnumeratorObject
*)type
->tp_alloc(type
, 0);
157 self
->enumerator
= loc_database_enumerator_ref(enumerator
);
160 return (PyObject
*)self
;
163 static PyObject
* Database_search_as(DatabaseObject
* self
, PyObject
* args
) {
164 const char* string
= NULL
;
166 if (!PyArg_ParseTuple(args
, "s", &string
))
169 struct loc_database_enumerator
* enumerator
;
171 int r
= loc_database_enumerator_new(&enumerator
, self
->db
);
173 PyErr_SetFromErrno(PyExc_SystemError
);
177 // Search string we are searching for
178 loc_database_enumerator_set_string(enumerator
, string
);
180 PyObject
* obj
= new_database_enumerator(&DatabaseEnumeratorType
, enumerator
);
181 loc_database_enumerator_unref(enumerator
);
186 static struct PyMethodDef Database_methods
[] = {
189 (PyCFunction
)Database_get_as
,
195 (PyCFunction
)Database_lookup
,
201 (PyCFunction
)Database_search_as
,
208 static struct PyGetSetDef Database_getsetters
[] = {
211 (getter
)Database_get_created_at
,
218 (getter
)Database_get_description
,
225 (getter
)Database_get_license
,
232 (getter
)Database_get_vendor
,
240 PyTypeObject DatabaseType
= {
241 PyVarObject_HEAD_INIT(NULL
, 0)
242 tp_name
: "location.Database",
243 tp_basicsize
: sizeof(DatabaseObject
),
244 tp_flags
: Py_TPFLAGS_DEFAULT
|Py_TPFLAGS_BASETYPE
,
245 tp_new
: Database_new
,
246 tp_dealloc
: (destructor
)Database_dealloc
,
247 tp_init
: (initproc
)Database_init
,
248 tp_doc
: "Database object",
249 tp_methods
: Database_methods
,
250 tp_getset
: Database_getsetters
,
251 tp_repr
: (reprfunc
)Database_repr
,
254 static PyObject
* DatabaseEnumerator_new(PyTypeObject
* type
, PyObject
* args
, PyObject
* kwds
) {
255 DatabaseEnumeratorObject
* self
= (DatabaseEnumeratorObject
*)type
->tp_alloc(type
, 0);
257 return (PyObject
*)self
;
260 static void DatabaseEnumerator_dealloc(DatabaseEnumeratorObject
* self
) {
261 loc_database_enumerator_unref(self
->enumerator
);
263 Py_TYPE(self
)->tp_free((PyObject
* )self
);
266 static PyObject
* DatabaseEnumerator_next(DatabaseEnumeratorObject
* self
) {
267 struct loc_as
* as
= loc_database_enumerator_next_as(self
->enumerator
);
269 PyObject
* obj
= new_as(&ASType
, as
);
275 // Nothing found, that means the end
276 PyErr_SetNone(PyExc_StopIteration
);
280 PyTypeObject DatabaseEnumeratorType
= {
281 PyVarObject_HEAD_INIT(NULL
, 0)
282 tp_name
: "location.DatabaseEnumerator",
283 tp_basicsize
: sizeof(DatabaseEnumeratorObject
),
284 tp_flags
: Py_TPFLAGS_DEFAULT
,
285 tp_alloc
: PyType_GenericAlloc
,
286 tp_new
: DatabaseEnumerator_new
,
287 tp_dealloc
: (destructor
)DatabaseEnumerator_dealloc
,
288 tp_iter
: PyObject_SelfIter
,
289 tp_iternext
: (iternextfunc
)DatabaseEnumerator_next
,