Merge branch 'collectd-5.5' into collectd-5.6
[collectd.git] / src / lua.c
index b89c824..351b8c6 100644 (file)
--- a/src/lua.c
+++ b/src/lua.c
@@ -62,11 +62,6 @@ typedef struct {
   int callback_id;
 } clua_callback_data_t;
 
-typedef struct {
-  const char *name;
-  lua_CFunction func;
-} lua_c_function_t;
-
 static char base_path[PATH_MAX];
 static lua_script_t *scripts;
 
@@ -367,7 +362,7 @@ static int lua_cb_register_write(lua_State *L) /* {{{ */
   return 0;
 } /* }}} int lua_cb_register_write */
 
-static lua_c_function_t 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},
@@ -375,7 +370,19 @@ static lua_c_function_t 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) /* {{{ */
 {
@@ -409,13 +416,15 @@ static int lua_script_init(lua_script_t *script) /* {{{ */
   /* 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') {
@@ -538,7 +547,7 @@ static int lua_config_script(const oconfig_item_t *ci) /* {{{ */
   if (status != 0)
     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 */
@@ -576,7 +585,7 @@ static int lua_shutdown(void) /* {{{ */
   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);
 }