author | Tero Marttila <terom@fixme.fi> |
Sat, 11 Apr 2009 01:54:33 +0300 | |
changeset 124 | f18d69425c4f |
parent 122 | 52ffbdb6bba1 |
child 134 | 978041c1c04d |
permissions | -rw-r--r-- |
93
42ade8285570
add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
1 |
#include "lua_objs.h" |
116
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
2 |
#include "lua_irc.h" |
104
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
3 |
#include "log.h" |
93
42ade8285570
add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
4 |
|
108
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
5 |
#include <stdlib.h> |
98
f357f835f0d5
add irc_client_defaults to apply default values for irc_client_add_net irc_net_info, implement --defaults cmd opt and lua_client_connect
Tero Marttila <terom@fixme.fi>
parents:
97
diff
changeset
|
6 |
#include <string.h> |
f357f835f0d5
add irc_client_defaults to apply default values for irc_client_add_net irc_net_info, implement --defaults cmd opt and lua_client_connect
Tero Marttila <terom@fixme.fi>
parents:
97
diff
changeset
|
7 |
|
116
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
8 |
void lua_obj_create_type (lua_State *L, const char *name, const struct luaL_Reg methods[]) |
96
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
9 |
{ |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
10 |
luaL_newmetatable(L, name); |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
11 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
12 |
// set the metatable __index to itself |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
13 |
lua_pushvalue(L, -1); |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
14 |
lua_setfield(L, -1, "__index"); |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
15 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
16 |
// register the methods to the metatable |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
17 |
luaL_register(L, NULL, methods); |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
18 |
} |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
19 |
|
116
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
20 |
void* lua_obj_create_obj (lua_State *L, const char *name, size_t size) |
96
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
21 |
{ |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
22 |
// create the new userdata on the stack |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
23 |
void *ud = lua_newuserdata(L, size); |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
24 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
25 |
// get the type and set it |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
26 |
luaL_getmetatable(L, name); |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
27 |
lua_setmetatable(L, -2); |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
28 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
29 |
// ok |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
30 |
return ud; |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
31 |
} |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
32 |
|
116
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
33 |
void* lua_obj_create_global_type (lua_State *L, const char *type_name, const struct luaL_Reg methods[], const char *global_name, size_t size) |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
34 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
35 |
// allocate the global object |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
36 |
void *obj = lua_newuserdata(L, size); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
37 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
38 |
// create the type metatable |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
39 |
lua_obj_create_type(L, type_name, methods); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
40 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
41 |
// set the userdata's metatable |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
42 |
lua_setmetatable(L, -2); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
43 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
44 |
// store it as a global |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
45 |
lua_setglobal(L, global_name); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
46 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
47 |
// ok |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
48 |
return obj; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
49 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
50 |
|
116
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
51 |
void* lua_obj_get_obj (lua_State *L, const char *func, const char *name) |
96
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
52 |
{ |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
53 |
void *ud; |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
54 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
55 |
// validate the userdata arg |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
56 |
if ((ud = luaL_checkudata(L, 1, name)) == NULL) { |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
57 |
luaL_error(L, "bad type argument to %s: `%s` expected", func, name); |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
58 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
59 |
// XXX: needs a __noreturn__ attribute |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
60 |
return NULL; |
96
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
61 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
62 |
} else { |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
63 |
// ok |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
64 |
return ud; |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
65 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
66 |
} |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
67 |
} |
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
68 |
|
a07d917adec1
add irc_chan and unify type/obj creation
Tero Marttila <terom@fixme.fi>
parents:
94
diff
changeset
|
69 |
/** |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
70 |
* Wrapper for module |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
71 |
*/ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
72 |
struct lua_module { |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
73 |
struct module *module; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
74 |
}; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
75 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
76 |
/** |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
77 |
* Create a lua_module userdata from the given module and push it onto the stack, returning 1. |
113
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
78 |
* |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
79 |
* The given module should be a reference of its own right. |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
80 |
*/ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
81 |
static int lua_module_create (lua_State *L, struct module *module) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
82 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
83 |
// create the new obj |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
84 |
struct lua_module *lua_module = lua_obj_create_obj(L, "spbot.module", sizeof(*lua_module)); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
85 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
86 |
// initialize |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
87 |
lua_module->module = module; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
88 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
89 |
// ok |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
90 |
return 1; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
91 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
92 |
|
107
5c1eeb45c7f2
support irc_chan type for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
106
diff
changeset
|
93 |
/** |
113
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
94 |
* module_put() our module reference |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
95 |
*/ |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
96 |
static int lua_module__gc (lua_State *L) |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
97 |
{ |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
98 |
struct lua_module *lua_module = lua_obj_get_obj(L, __func__, "spbot.module"); |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
99 |
|
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
100 |
// put it |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
101 |
module_put(lua_module->module); |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
102 |
|
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
103 |
return 0; |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
104 |
} |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
105 |
|
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
106 |
static int lua_module_conf (lua_State *L) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
107 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
108 |
struct lua_module *lua_module = lua_obj_get_obj(L, __func__, "spbot.module"); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
109 |
const struct config_option *option; |
124
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
110 |
struct error_info err; |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
111 |
bool is_err = true; |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
112 |
|
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
113 |
// the list of given config values, and temporary storage for string values |
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
114 |
struct config_value values[CONFIG_VALUES_MAX], *value = values; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
115 |
char *value_bufs[CONFIG_VALUES_MAX], **value_buf = value_bufs; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
116 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
117 |
// number of arguments given |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
118 |
int nargs = lua_gettop(L), argidx = 2; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
119 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
120 |
// init to zero |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
121 |
memset(values, 0, sizeof(values)); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
122 |
memset(value_bufs, 0, sizeof(value_bufs)); |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
123 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
124 |
// XXX: come up with some better way... |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
125 |
struct nexus *nexus = lua_module->module->modules->nexus; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
126 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
127 |
// the config name |
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
128 |
const char *conf_name = luaL_checkstring(L, argidx++); |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
129 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
130 |
// look it up |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
131 |
if ((option = module_conf_lookup(lua_module->module, conf_name, &err)) == NULL) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
132 |
return luaL_error(L, "module_conf_lookup: %s/%s: %s", module_name(lua_module->module), conf_name, error_msg(&err)); |
107
5c1eeb45c7f2
support irc_chan type for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
106
diff
changeset
|
133 |
|
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
134 |
// maximum number of arguments accepted |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
135 |
int maxargs = config_params_count(option); |
107
5c1eeb45c7f2
support irc_chan type for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
106
diff
changeset
|
136 |
|
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
137 |
// too many arguments? |
124
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
138 |
if (nargs - argidx > maxargs) |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
139 |
return luaL_error(L, "lua_module_conf: too many arguments (>%d) given (%d)", maxargs, nargs - argidx); |
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
140 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
141 |
// the current param |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
142 |
const struct config_param *param = option->params; |
107
5c1eeb45c7f2
support irc_chan type for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
106
diff
changeset
|
143 |
|
124
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
144 |
// apply each given argument to the correct param, storing it in value |
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
145 |
for (; argidx <= nargs; argidx++, value++, param++) { |
124
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
146 |
// the given config value |
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
147 |
switch (lua_type(L, argidx)) { |
124
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
148 |
case LUA_TNONE: |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
149 |
case LUA_TNIL: |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
150 |
// no value |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
151 |
value->type = CONFIG_NULL; |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
152 |
|
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
153 |
break; |
f18d69425c4f
fix up lua_module_conf/config_* enough so that logwatch_conf_filter works
Tero Marttila <terom@fixme.fi>
parents:
122
diff
changeset
|
154 |
|
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
155 |
case LUA_TSTRING: { |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
156 |
// string arg |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
157 |
const char *arg_str = lua_tostring(L, argidx); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
158 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
159 |
// copy it as a mutable string buffer |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
160 |
if ((*value_buf = strdup(arg_str)) == NULL) { |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
161 |
lua_pushfstring(L, "strdup"); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
162 |
goto error; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
163 |
} |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
164 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
165 |
// parse it as a raw value |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
166 |
if (config_parse_param(param, nexus, value, *value_buf, &err)) { |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
167 |
lua_pushfstring(L, "config_parse: %s/%s: %s", option->name, *value_buf, error_msg(&err)); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
168 |
goto error; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
169 |
} |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
170 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
171 |
// seek to next value_buf |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
172 |
value_buf++; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
173 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
174 |
} break; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
175 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
176 |
case LUA_TUSERDATA: |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
177 |
// some kind of userdata, use its metatable to figure out what type it is |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
178 |
if (!lua_getmetatable(L, argidx)) { |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
179 |
lua_pushfstring(L, "config value is userdata without metatable"); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
180 |
goto error; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
181 |
} |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
182 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
183 |
// get the target metatable |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
184 |
lua_getfield(L, LUA_REGISTRYINDEX, "evirc.chan"); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
185 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
186 |
// is it a chan? |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
187 |
if (!lua_rawequal(L, -1, -2)) { |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
188 |
lua_pushfstring(L, "config value is userdata of unknown type"); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
189 |
goto error; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
190 |
} |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
191 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
192 |
// pop the metatables |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
193 |
lua_pop(L, 2); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
194 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
195 |
// get the irc_chan |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
196 |
struct lua_chan *lua_chan = lua_touserdata(L, argidx); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
197 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
198 |
// build the value |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
199 |
value->type = CONFIG_IRC_CHAN; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
200 |
value->irc_chan = lua_chan->chan; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
201 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
202 |
break; |
107
5c1eeb45c7f2
support irc_chan type for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
106
diff
changeset
|
203 |
|
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
204 |
default: |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
205 |
lua_pushfstring(L, "config value is of unknown lua type '%s'", lua_typename(L, argidx)); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
206 |
goto error; |
107
5c1eeb45c7f2
support irc_chan type for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
106
diff
changeset
|
207 |
|
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
208 |
} |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
209 |
} |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
210 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
211 |
// apply it |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
212 |
if (module_conf(lua_module->module, option, values, &err)) { |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
213 |
lua_pushfstring(L, "module_conf: %s/%s: %s", module_name(lua_module->module), option->name, error_msg(&err)); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
214 |
goto error; |
107
5c1eeb45c7f2
support irc_chan type for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
106
diff
changeset
|
215 |
} |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
216 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
217 |
// ok |
122
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
218 |
is_err = false; |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
219 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
220 |
error: |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
221 |
// release any allocated strings |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
222 |
for (value_buf = value_bufs; value_buf <= value_bufs + CONFIG_VALUES_MAX && *value_buf; value_buf++) |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
223 |
free(*value_buf); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
224 |
|
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
225 |
// either error or successful return |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
226 |
if (is_err) |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
227 |
return lua_error(L); |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
228 |
else |
52ffbdb6bba1
start implementing multiple args for lua_module_conf
Tero Marttila <terom@fixme.fi>
parents:
120
diff
changeset
|
229 |
return 0; |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
230 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
231 |
|
113
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
232 |
static int lua_module_unload (lua_State *L) |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
233 |
{ |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
234 |
struct lua_module *lua_module = lua_obj_get_obj(L, __func__, "spbot.module"); |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
235 |
struct error_info err; |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
236 |
|
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
237 |
// just unload it |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
238 |
if ((ERROR_CODE(&err) = module_unload(lua_module->module))) |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
239 |
return luaL_error(L, "module_unload: %s: %s", module_name(lua_module->module), error_msg(&err)); |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
240 |
|
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
241 |
// ok |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
242 |
return 0; |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
243 |
} |
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
244 |
|
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
245 |
static const struct luaL_Reg lua_module_methods[] = { |
113
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
246 |
{ "__gc", &lua_module__gc }, |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
247 |
{ "conf", &lua_module_conf }, |
113
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
248 |
{ "unload", &lua_module_unload }, |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
249 |
{ NULL, NULL } |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
250 |
}; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
251 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
252 |
/** |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
253 |
* Initialize the lua_module object type |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
254 |
*/ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
255 |
static void lua_module_init (lua_State *L) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
256 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
257 |
lua_obj_create_type(L, "spbot.module", lua_module_methods); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
258 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
259 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
260 |
/** |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
261 |
* Wrapper for modules |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
262 |
*/ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
263 |
struct lua_modules { |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
264 |
struct modules *modules; |
108
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
265 |
|
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
266 |
// strdup'd path for module_path |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
267 |
// XXX: remove when gc'd |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
268 |
char *path; |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
269 |
}; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
270 |
|
114
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
271 |
static int lua_modules__gc (lua_State *L) |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
272 |
{ |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
273 |
struct lua_modules *lua_modules = lua_obj_get_obj(L, __func__, "spbot.modules"); |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
274 |
|
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
275 |
// remove the modules path if it was set by us |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
276 |
if (lua_modules->path && modules_path(lua_modules->modules, NULL) == lua_modules->path) |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
277 |
modules_path(lua_modules->modules, ""); |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
278 |
|
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
279 |
// release any strdup'd path |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
280 |
free(lua_modules->path); |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
281 |
|
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
282 |
// ok |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
283 |
return 0; |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
284 |
} |
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
285 |
|
108
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
286 |
static int lua_modules_path (lua_State *L) |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
287 |
{ |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
288 |
struct lua_modules *lua_modules = lua_obj_get_obj(L, __func__, "spbot.modules"); |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
289 |
char *path = NULL; |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
290 |
const char *old_path; |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
291 |
|
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
292 |
if (!lua_isnoneornil(L, 2)) { |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
293 |
// the new path |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
294 |
if ((path = strdup(luaL_checkstring(L, 2))) == NULL) |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
295 |
return luaL_error(L, "strdup"); |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
296 |
} |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
297 |
|
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
298 |
// set or get |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
299 |
old_path = modules_path(lua_modules->modules, path); |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
300 |
|
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
301 |
// return the old path |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
302 |
if (old_path) |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
303 |
lua_pushstring(L, old_path); |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
304 |
else |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
305 |
lua_pushnil(L); |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
306 |
|
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
307 |
if (path) { |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
308 |
// replace the old path |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
309 |
free(lua_modules->path); |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
310 |
lua_modules->path = path; |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
311 |
} |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
312 |
|
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
313 |
// ok |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
314 |
return 1; |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
315 |
} |
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
316 |
|
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
317 |
static int lua_modules_load (lua_State *L) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
318 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
319 |
struct lua_modules *lua_modules = lua_obj_get_obj(L, __func__, "spbot.modules"); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
320 |
struct module *module; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
321 |
struct module_info info; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
322 |
struct error_info err; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
323 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
324 |
// the module name/path |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
325 |
info.name = luaL_checkstring(L, 2); |
108
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
326 |
info.path = lua_isnoneornil(L, 3) ? NULL : luaL_checkstring(L, 3); |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
327 |
|
113
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
328 |
// load and get a new reference |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
329 |
if (module_load(lua_modules->modules, &module, &info, &err)) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
330 |
return luaL_error(L, "module_load: %s/%s: %s", info.name, info.path, error_msg(&err)); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
331 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
332 |
// wrap |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
333 |
return lua_module_create(L, module); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
334 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
335 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
336 |
static int lua_modules_module (lua_State *L) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
337 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
338 |
struct lua_modules *lua_modules = lua_obj_get_obj(L, __func__, "spbot.modules"); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
339 |
struct module *module; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
340 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
341 |
// the module name |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
342 |
const char *name = luaL_checkstring(L, 2); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
343 |
|
113
477d1cb3d87c
implement lua_module_unload and lua_module_gc to release references
Tero Marttila <terom@fixme.fi>
parents:
109
diff
changeset
|
344 |
// look it up, as a new reference |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
345 |
if ((module = module_get(lua_modules->modules, name)) == NULL) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
346 |
return luaL_error(L, "module_get: %s: no such module", name); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
347 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
348 |
// wrap |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
349 |
return lua_module_create(L, module); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
350 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
351 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
352 |
static const struct luaL_Reg lua_modules_methods[] = { |
114
6de0490408f4
implement lua_modules__gc in case the modules global gets lost
Tero Marttila <terom@fixme.fi>
parents:
113
diff
changeset
|
353 |
{ "__gc", &lua_modules__gc }, |
108
50ff7ac8a725
implement modules_path + module_load with NULL path
Tero Marttila <terom@fixme.fi>
parents:
107
diff
changeset
|
354 |
{ "path", &lua_modules_path }, |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
355 |
{ "load", &lua_modules_load }, |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
356 |
{ "module", &lua_modules_module }, |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
357 |
{ NULL, NULL } |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
358 |
}; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
359 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
360 |
/** |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
361 |
* Initialize the spbot.modules type for lua_modules, and registers an instance bound to the given modules list at |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
362 |
* 'modules'. |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
363 |
*/ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
364 |
static void lua_modules_init (lua_State *L, struct modules *modules) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
365 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
366 |
// allocate the global "modules" object |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
367 |
struct lua_modules *lua_modules = lua_obj_create_global_type(L, "spbot.modules", lua_modules_methods, "modules", sizeof(*lua_modules)); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
368 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
369 |
// initialize it |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
370 |
lua_modules->modules = modules; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
371 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
372 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
373 |
/** |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
374 |
* Wrapper for nexus |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
375 |
*/ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
376 |
struct lua_nexus { |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
377 |
struct nexus *nexus; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
378 |
}; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
379 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
380 |
static int lua_nexus_shutdown (lua_State *L) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
381 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
382 |
struct lua_nexus *lua_nexus = lua_obj_get_obj(L, __func__, "spbot.nexus"); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
383 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
384 |
// just shut it down |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
385 |
nexus_shutdown(lua_nexus->nexus); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
386 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
387 |
return 0; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
388 |
} |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
389 |
|
109
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
390 |
static int lua_nexus_load_config (lua_State *L) |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
391 |
{ |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
392 |
struct lua_nexus *lua_nexus = lua_obj_get_obj(L, __func__, "spbot.nexus"); |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
393 |
struct error_info err; |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
394 |
|
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
395 |
const char *path = luaL_checkstring(L, 2); |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
396 |
|
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
397 |
// just load it |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
398 |
if (nexus_load_config(lua_nexus->nexus, path, &err)) |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
399 |
return luaL_error(L, "nexus_load_config(%s): %s", path, error_msg(&err)); |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
400 |
|
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
401 |
return 0; |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
402 |
} |
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
403 |
|
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
404 |
static const struct luaL_Reg lua_nexus_methods[] = { |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
405 |
{ "shutdown", &lua_nexus_shutdown }, |
109
bfe9b9a8fe5b
fix some more valgrind errors
Tero Marttila <terom@fixme.fi>
parents:
108
diff
changeset
|
406 |
{ "load_config", &lua_nexus_load_config }, |
103
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
407 |
{ NULL, NULL } |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
408 |
}; |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
409 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
410 |
/** |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
411 |
* Initialize the spbot.nexus type for lua_nexus, and registers an instance bound to the given nexus list at |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
412 |
* 'nexus'. |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
413 |
*/ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
414 |
static void lua_nexus_init (lua_State *L, struct nexus *nexus) |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
415 |
{ |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
416 |
// allocate the global "nexus" object |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
417 |
struct lua_nexus *lua_nexus = lua_obj_create_global_type(L, "spbot.nexus", lua_nexus_methods, "nexus", sizeof(*lua_nexus)); |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
418 |
|
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
419 |
// initialize it |
454aea1e4f11
implement nexus_shutdown, lua_modules/lua_module, and lua_nexus
Tero Marttila <terom@fixme.fi>
parents:
99
diff
changeset
|
420 |
lua_nexus->nexus = nexus; |
93
42ade8285570
add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
421 |
} |
42ade8285570
add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
422 |
|
98
f357f835f0d5
add irc_client_defaults to apply default values for irc_client_add_net irc_net_info, implement --defaults cmd opt and lua_client_connect
Tero Marttila <terom@fixme.fi>
parents:
97
diff
changeset
|
423 |
/** |
104
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
424 |
* Global functions |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
425 |
*/ |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
426 |
static int lua_log_level (lua_State *L) |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
427 |
{ |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
428 |
// log level as a string |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
429 |
enum log_level new_level = luaL_checkoption(L, 1, NULL, log_level_names); |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
430 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
431 |
// set it |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
432 |
set_log_level(new_level); |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
433 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
434 |
// ok |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
435 |
return 0; |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
436 |
} |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
437 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
438 |
static int lua_log (lua_State *L) |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
439 |
{ |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
440 |
// log level as a string |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
441 |
enum log_level level = luaL_checkoption(L, 1, NULL, log_level_names); |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
442 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
443 |
// log message |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
444 |
const char *msg = luaL_checkstring(L, 2); |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
445 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
446 |
// log it |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
447 |
log_msg(level, "lua", "%s", msg); |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
448 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
449 |
// ok |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
450 |
return 0; |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
451 |
} |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
452 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
453 |
static const struct luaL_Reg lua_global_functions[] = { |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
454 |
{ "log_level", &lua_log_level }, |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
455 |
{ "log", &lua_log }, |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
456 |
{ NULL, NULL } |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
457 |
}; |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
458 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
459 |
static void lua_global_init (lua_State *L) |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
460 |
{ |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
461 |
const struct luaL_Reg *reg; |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
462 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
463 |
for (reg = lua_global_functions; reg->name && reg->func; reg++) { |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
464 |
// put the function on the stack |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
465 |
lua_pushcfunction(L, reg->func); |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
466 |
|
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
467 |
// set the global |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
468 |
lua_setglobal(L, reg->name); |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
469 |
} |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
470 |
} |
fc196bb4bcc2
implement lua_log and lua_log_level
Tero Marttila <terom@fixme.fi>
parents:
103
diff
changeset
|
471 |
|
116
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
472 |
void lua_objs_init (struct nexus_lua *lua) |
93
42ade8285570
add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
473 |
{ |
42ade8285570
add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
474 |
// init the various bits |
116
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
475 |
lua_global_init(lua->st); |
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
476 |
lua_nexus_init(lua->st, lua->nexus); |
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
477 |
lua_modules_init(lua->st, lua->nexus->modules); |
92e71129074d
split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
114
diff
changeset
|
478 |
lua_module_init(lua->st); |
93
42ade8285570
add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
479 |
} |
98
f357f835f0d5
add irc_client_defaults to apply default values for irc_client_add_net irc_net_info, implement --defaults cmd opt and lua_client_connect
Tero Marttila <terom@fixme.fi>
parents:
97
diff
changeset
|
480 |