X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Flua.c;h=8cfb70459991317048e6cdeb0b6be27146c95cdf;hb=e746ad785774de37a30302fef65f1c4aaf8698ab;hp=a3f2037e2ffb11b6967ed9e3a76a2501a464aca1;hpb=f6c4f3e43d5a8a49de8f6a5d9ee8ae362fc7f0b1;p=collectd.git diff --git a/src/lua.c b/src/lua.c index a3f2037e..8cfb7045 100644 --- a/src/lua.c +++ b/src/lua.c @@ -32,15 +32,15 @@ * GCC will complain about the macro definition. */ #define DONT_POISON_SPRINTF_YET -#include "collectd.h" #include "common.h" #include "plugin.h" +#include "collectd.h" /* Include the Lua API header files. */ -#include "utils_lua.h" #include #include #include +#include "utils_lua.h" #include @@ -79,10 +79,10 @@ static int clua_load_callback(lua_State *L, int callback_ref) /* {{{ */ if (!lua_isfunction(L, -1)) { lua_pop(L, 1); - return (-1); + return -1; } - return (0); + return 0; } /* }}} int clua_load_callback */ /* Store the threads in a global variable so they are not cleaned up by the @@ -96,12 +96,12 @@ static int clua_store_thread(lua_State *L, int idx) /* {{{ */ lua_pushvalue(L, idx); /* +1 = 3 */ if (!lua_isthread(L, -1)) { lua_pop(L, 3); /* -3 = 0 */ - return (-1); + return -1; } luaL_ref(L, LUA_REGISTRYINDEX); lua_pop(L, 1); /* -1 = 0 */ - return (0); + return 0; } /* }}} int clua_store_thread */ static int clua_read(user_data_t *ud) /* {{{ */ @@ -117,7 +117,7 @@ static int clua_read(user_data_t *ud) /* {{{ */ ERROR("Lua plugin: Unable to load callback \"%s\" (id %i).", cb->lua_function_name, cb->callback_id); pthread_mutex_unlock(&cb->lock); - return (-1); + return -1; } /* +1 = 1 */ @@ -131,7 +131,7 @@ static int clua_read(user_data_t *ud) /* {{{ */ ERROR("Lua plugin: Calling a read callback failed: %s", errmsg); lua_pop(L, 1); pthread_mutex_unlock(&cb->lock); - return (-1); + return -1; } if (!lua_isnumber(L, -1)) { @@ -147,7 +147,7 @@ static int clua_read(user_data_t *ud) /* {{{ */ lua_pop(L, 1); /* -1 = 0 */ pthread_mutex_unlock(&cb->lock); - return (status); + return status; } /* }}} int clua_read */ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ @@ -163,7 +163,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ ERROR("Lua plugin: Unable to load callback \"%s\" (id %i).", cb->lua_function_name, cb->callback_id); pthread_mutex_unlock(&cb->lock); - return (-1); + return -1; } /* +1 = 1 */ @@ -172,7 +172,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ lua_pop(L, 1); /* -1 = 0 */ pthread_mutex_unlock(&cb->lock); ERROR("Lua plugin: luaC_pushvaluelist failed."); - return (-1); + return -1; } /* +1 = 2 */ @@ -186,7 +186,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ ERROR("Lua plugin: Calling the write callback failed:\n%s", errmsg); lua_pop(L, 1); /* -1 = 0 */ pthread_mutex_unlock(&cb->lock); - return (-1); + return -1; } if (!lua_isnumber(L, -1)) { @@ -200,7 +200,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ lua_pop(L, 1); /* -1 = 0 */ pthread_mutex_unlock(&cb->lock); - return (status); + return status; } /* }}} int clua_write */ /* @@ -282,7 +282,7 @@ static int lua_cb_register_read(lua_State *L) /* {{{ */ luaL_checktype(L, 1, LUA_TFUNCTION); char function_name[DATA_MAX_NAME_LEN]; - ssnprintf(function_name, sizeof(function_name), "lua/%s", lua_tostring(L, 1)); + snprintf(function_name, sizeof(function_name), "lua/%s", lua_tostring(L, 1)); int callback_id = clua_store_callback(L, 1); if (callback_id < 0) @@ -303,15 +303,13 @@ static int lua_cb_register_read(lua_State *L) /* {{{ */ cb->lua_function_name = strdup(function_name); pthread_mutex_init(&cb->lock, NULL); - user_data_t ud = { - .data = cb - }; - int status = plugin_register_complex_read(/* group = */ "lua", /* name = */ function_name, /* callback = */ clua_read, /* interval = */ 0, - /* user_data = */ &ud); + &(user_data_t){ + .data = cb, + }); if (status != 0) return luaL_error(L, "%s", "plugin_register_complex_read failed"); @@ -328,7 +326,7 @@ static int lua_cb_register_write(lua_State *L) /* {{{ */ luaL_checktype(L, 1, LUA_TFUNCTION); char function_name[DATA_MAX_NAME_LEN] = ""; - ssnprintf(function_name, sizeof(function_name), "lua/%s", lua_tostring(L, 1)); + snprintf(function_name, sizeof(function_name), "lua/%s", lua_tostring(L, 1)); int callback_id = clua_store_callback(L, 1); if (callback_id < 0) @@ -349,20 +347,18 @@ static int lua_cb_register_write(lua_State *L) /* {{{ */ cb->lua_function_name = strdup(function_name); pthread_mutex_init(&cb->lock, NULL); - user_data_t ud = { - .data = cb - }; - int status = plugin_register_write(/* name = */ function_name, - /* callback = */ clua_write, - /* user_data = */ &ud); + /* callback = */ clua_write, + &(user_data_t){ + .data = cb, + }); if (status != 0) return luaL_error(L, "%s", "plugin_register_write failed"); return 0; } /* }}} int lua_cb_register_write */ -static luaL_Reg lua_c_functions[] = { +static const luaL_Reg collectdlib[] = { {"log_debug", lua_cb_log_debug}, {"log_error", lua_cb_log_error}, {"log_info", lua_cb_log_info}, @@ -370,7 +366,18 @@ static luaL_Reg lua_c_functions[] = { {"log_warning", lua_cb_log_warning}, {"dispatch_values", lua_cb_dispatch_values}, {"register_read", lua_cb_register_read}, - {"register_write", lua_cb_register_write}}; + {"register_write", lua_cb_register_write}, + {NULL, NULL}}; + +static int open_collectd(lua_State *L) /* {{{ */ +{ +#if LUA_VERSION_NUM < 502 + luaL_register(L, "collectd", collectdlib); +#else + luaL_newlib(L, collectdlib); +#endif + return 1; +} /* }}} */ static void lua_script_free(lua_script_t *script) /* {{{ */ { @@ -398,19 +405,21 @@ static int lua_script_init(lua_script_t *script) /* {{{ */ script->lua_state = luaL_newstate(); if (script->lua_state == NULL) { ERROR("Lua plugin: luaL_newstate() failed."); - return (-1); + return -1; } /* Open up all the standard Lua libraries. */ luaL_openlibs(script->lua_state); - /* Register all the functions we implement in C */ - lua_newtable(script->lua_state); - for (size_t i = 0; i < STATIC_ARRAY_SIZE(lua_c_functions); i++) { - lua_pushcfunction(script->lua_state, lua_c_functions[i].func); - lua_setfield(script->lua_state, -2, lua_c_functions[i].name); - } - lua_setglobal(script->lua_state, "collectd"); +/* Load the 'collectd' library */ +#if LUA_VERSION_NUM < 502 + lua_pushcfunction(script->lua_state, open_collectd); + lua_pushstring(script->lua_state, "collectd"); + lua_call(script->lua_state, 1, 0); +#else + luaL_requiref(script->lua_state, "collectd", open_collectd, 1); + lua_pop(script->lua_state, 1); +#endif /* Prepend BasePath to package.path */ if (base_path[0] != '\0') { @@ -429,7 +438,7 @@ static int lua_script_init(lua_script_t *script) /* {{{ */ lua_pop(script->lua_state, 1); } - return (0); + return 0; } /* }}} int lua_script_init */ static int lua_script_load(const char *script_path) /* {{{ */ @@ -437,20 +446,20 @@ static int lua_script_load(const char *script_path) /* {{{ */ lua_script_t *script = malloc(sizeof(*script)); if (script == NULL) { ERROR("Lua plugin: malloc failed."); - return (-1); + return -1; } int status = lua_script_init(script); if (status != 0) { lua_script_free(script); - return (status); + return status; } script->script_path = strdup(script_path); if (script->script_path == NULL) { ERROR("Lua plugin: strdup failed."); lua_script_free(script); - return (-1); + return -1; } status = luaL_loadfile(script->lua_state, script->script_path); @@ -459,7 +468,7 @@ static int lua_script_load(const char *script_path) /* {{{ */ lua_tostring(script->lua_state, -1)); lua_pop(script->lua_state, 1); lua_script_free(script); - return (-1); + return -1; } status = lua_pcall(script->lua_state, @@ -478,7 +487,7 @@ static int lua_script_load(const char *script_path) /* {{{ */ script->script_path, errmsg); lua_script_free(script); - return (-1); + return -1; } /* Append this script to the global list of scripts. */ @@ -492,14 +501,14 @@ static int lua_script_load(const char *script_path) /* {{{ */ scripts = script; } - return (0); + return 0; } /* }}} int lua_script_load */ static int lua_config_base_path(const oconfig_item_t *ci) /* {{{ */ { int status = cf_util_get_string_buffer(ci, base_path, sizeof(base_path)); if (status != 0) - return (status); + return status; size_t len = strlen(base_path); while ((len > 0) && (base_path[len - 1] == '/')) { @@ -509,7 +518,7 @@ static int lua_config_base_path(const oconfig_item_t *ci) /* {{{ */ DEBUG("Lua plugin: base_path = \"%s\";", base_path); - return (0); + return 0; } /* }}} int lua_config_base_path */ static int lua_config_script(const oconfig_item_t *ci) /* {{{ */ @@ -518,22 +527,22 @@ static int lua_config_script(const oconfig_item_t *ci) /* {{{ */ int status = cf_util_get_string_buffer(ci, rel_path, sizeof(rel_path)); if (status != 0) - return (status); + return status; char abs_path[PATH_MAX]; if (base_path[0] == '\0') sstrncpy(abs_path, rel_path, sizeof(abs_path)); else - ssnprintf(abs_path, sizeof(abs_path), "%s/%s", base_path, rel_path); + snprintf(abs_path, sizeof(abs_path), "%s/%s", base_path, rel_path); DEBUG("Lua plugin: abs_path = \"%s\";", abs_path); status = lua_script_load(abs_path); if (status != 0) - return (status); + return status; - INFO("Lua plugin: File \"%s\" loaded succesfully", abs_path); + INFO("Lua plugin: File \"%s\" loaded successfully", abs_path); return 0; } /* }}} int lua_config_script */ @@ -568,12 +577,10 @@ static int lua_shutdown(void) /* {{{ */ { lua_script_free(scripts); - return (0); + return 0; } /* }}} int lua_shutdown */ -void module_register() { +void module_register(void) { plugin_register_complex_config("lua", lua_config); plugin_register_shutdown("lua", lua_shutdown); } - -/* vim: set sw=2 sts=2 et fdm=marker : */