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>
28 typedef struct database
{
29 struct loc_database
* db
;
32 static Database
* luaL_checkdatabase(lua_State
* L
, int i
) {
33 void* userdata
= luaL_checkudata(L
, i
, "location.Database");
35 // Throw an error if the argument doesn't match
36 luaL_argcheck(L
, userdata
, i
, "Database expected");
38 return (Database
*)userdata
;
41 static int Database_open(lua_State
* L
) {
42 const char* path
= NULL
;
47 path
= luaL_checkstring(L
, 1);
49 // Allocate a new object
50 Database
* self
= (Database
*)lua_newuserdata(L
, sizeof(*self
));
53 luaL_setmetatable(L
, "location.Database");
55 // Open the database file
58 return luaL_error(L
, "Could not open %s: %s\n", path
, strerror(errno
));
61 r
= loc_database_new(ctx
, &self
->db
, f
);
63 // Close the file descriptor
68 return luaL_error(L
, "Could not open database %s: %s\n", path
, strerror(errno
));
73 static int Database_close(lua_State
* L
) {
74 Database
* self
= luaL_checkdatabase(L
, 0);
77 loc_database_unref(self
->db
);
83 static int Database_lookup(lua_State
* L
) {
84 struct loc_network
* network
= NULL
;
87 Database
* self
= luaL_checkdatabase(L
, 0);
90 const char* address
= luaL_checkstring(L
, 1);
93 r
= loc_database_lookup_from_string(self
->db
, address
, &network
);
95 return luaL_error(L
, "Could not lookup address %s: %s\n", address
, strerror(errno
));
97 // XXX Return the network
99 loc_network_unref(network
);
104 static const struct luaL_Reg database_functions
[] = {
105 { "open", Database_open
},
106 { "lookup", Database_lookup
},
107 { "__gc", Database_close
},
111 int register_database(lua_State
* L
) {
112 return register_class(L
, "location.Database", database_functions
);