src/utils_format_json.c: Check return values of yajl_gen_* functions.
[collectd.git] / src / lua.c
index bbfcb2f..2bd56a1 100644 (file)
--- a/src/lua.c
+++ b/src/lua.c
  * 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 <lauxlib.h>
 #include <lua.h>
 #include <lualib.h>
+#include "utils_lua.h"
 
 #include <pthread.h>
 
@@ -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;
 
@@ -260,6 +255,7 @@ static int lua_cb_dispatch_values(lua_State *L) /* {{{ */
   if (vl == NULL)
     return luaL_error(L, "%s", "luaC_tovaluelist failed");
 
+#if COLLECT_DEBUG
   char identifier[6 * DATA_MAX_NAME_LEN];
   FORMAT_VL(identifier, sizeof(identifier), vl);
 
@@ -267,6 +263,7 @@ static int lua_cb_dispatch_values(lua_State *L) /* {{{ */
         "time %.3f, interval %.3f.",
         identifier, CDTIME_T_TO_DOUBLE(vl->time),
         CDTIME_T_TO_DOUBLE(vl->interval));
+#endif
 
   plugin_dispatch_values(vl);
 
@@ -306,15 +303,12 @@ 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);
+                                            /* interval  = */ 0, &(user_data_t){
+                                                                     .data = cb,
+                                                                 });
 
   if (status != 0)
     return luaL_error(L, "%s", "plugin_register_complex_read failed");
@@ -352,20 +346,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);
+  int status =
+      plugin_register_write(/* name = */ function_name,
+                            /* 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 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},
@@ -373,7 +365,18 @@ 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) /* {{{ */
 {
@@ -407,13 +410,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') {
@@ -536,7 +541,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 */
@@ -574,7 +579,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);
 }