2 libloc - A library to determine the location of someone on the Internet
4 Copyright (C) 2024 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.
23 #include <libloc/database.h>
30 typedef struct database
{
31 struct loc_database
* db
;
34 static Database
* luaL_checkdatabase(lua_State
* L
, int i
) {
35 void* userdata
= luaL_checkudata(L
, i
, "location.Database");
37 // Throw an error if the argument doesn't match
38 luaL_argcheck(L
, userdata
, i
, "Database expected");
40 return (Database
*)userdata
;
43 static int Database_open(lua_State
* L
) {
44 const char* path
= NULL
;
49 path
= luaL_checkstring(L
, 1);
51 // Allocate a new object
52 Database
* self
= (Database
*)lua_newuserdata(L
, sizeof(*self
));
55 luaL_setmetatable(L
, "location.Database");
57 // Open the database file
60 return luaL_error(L
, "Could not open %s: %s\n", path
, strerror(errno
));
63 r
= loc_database_new(ctx
, &self
->db
, f
);
65 // Close the file descriptor
70 return luaL_error(L
, "Could not open database %s: %s\n", path
, strerror(errno
));
75 static int Database_gc(lua_State
* L
) {
76 Database
* self
= luaL_checkdatabase(L
, 1);
80 loc_database_unref(self
->db
);
87 static int Database_get_as(lua_State
* L
) {
88 struct loc_as
* as
= NULL
;
91 Database
* self
= luaL_checkdatabase(L
, 1);
94 uint32_t asn
= luaL_checknumber(L
, 2);
97 r
= loc_database_get_as(self
->db
, &as
, asn
);
103 // Create a new AS object
104 r
= create_as(L
, as
);
110 static int Database_lookup(lua_State
* L
) {
111 struct loc_network
* network
= NULL
;
114 Database
* self
= luaL_checkdatabase(L
, 1);
117 const char* address
= luaL_checkstring(L
, 2);
120 r
= loc_database_lookup_from_string(self
->db
, address
, &network
);
122 return luaL_error(L
, "Could not lookup address %s: %s\n", address
, strerror(errno
));
124 // Create a network object
125 r
= create_network(L
, network
);
126 loc_network_unref(network
);
131 static const struct luaL_Reg database_functions
[] = {
132 { "get_as", Database_get_as
},
133 { "open", Database_open
},
134 { "lookup", Database_lookup
},
135 { "__gc", Database_gc
},
139 int register_database(lua_State
* L
) {
140 return register_class(L
, "location.Database", database_functions
);