X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Flua.c;h=b4f30ee179e8401133de158f84a3d545ebb6620a;hb=ba6801e05bb6970fca853c3f4568223db3bf51a0;hp=d13acc82684fe2d4caee87ab91272785e89b2342;hpb=4227efa91b3c2ed7f2e8f8e9b19ab414f7a35e6d;p=collectd.git diff --git a/src/lua.c b/src/lua.c index d13acc82..b4f30ee1 100644 --- a/src/lua.c +++ b/src/lua.c @@ -36,6 +36,7 @@ #include #include #include +#include "utils_lua.h" #if defined(COLLECT_DEBUG) && COLLECT_DEBUG && defined(__GNUC__) && __GNUC__ # undef sprintf @@ -111,213 +112,6 @@ static int clua_read (user_data_t *ud) /* {{{ */ return (1); \ } while (0) -static int ltoc_value (lua_State *l, /* {{{ */ - int ds_type, value_t *ret_value) -{ - if (!lua_isnumber (l, /* stack pos = */ -1)) - return (-1); - - if (ds_type == DS_TYPE_GAUGE) - ret_value->gauge = (gauge_t) lua_tonumber (l, /* stack pos = */ -1); - else if (ds_type == DS_TYPE_DERIVE) - ret_value->derive = (derive_t) lua_tointeger (l, /* stack pos = */ -1); - else if (ds_type == DS_TYPE_COUNTER) - ret_value->counter = (counter_t) lua_tointeger (l, /* stack pos = */ -1); - else if (ds_type == DS_TYPE_ABSOLUTE) - ret_value->absolute = (absolute_t) lua_tointeger (l, /* stack pos = */ -1); - else - assert (23 == 42); - - return (0); -} /* }}} int ltoc_value */ - -static int ltoc_values (lua_State *l, /* {{{ */ - const data_set_t *ds, - value_t *ret_values) -{ - size_t i; - int status = 0; - - if (!lua_istable (l, -1)) - { - lua_pop (l, /* nelem = */ 1); - return (-1); - } - - /* Push initial key */ - lua_pushnil (l); - for (i = 0; i < ((size_t) ds->ds_num); i++) - { - /* Pops old key and pushed new key and value. */ - status = lua_next (l, -2); - if (status == 0) /* no more elements */ - break; - - status = ltoc_value (l, ds->ds[i].type, ret_values + i); - if (status != 0) - { - DEBUG ("ltoc_value failed."); - break; - } - - /* Pop the value */ - lua_pop (l, /* nelems = */ 1); - } - /* Pop the key and the table itself */ - lua_pop (l, /* nelems = */ 2); - - return (status); -} /* }}} int ltoc_values */ - -static int ltoc_table_values (lua_State *l, /* {{{ */ - const data_set_t *ds, value_list_t *vl) -{ - int status; - - lua_pushstring (l, "values"); - lua_gettable (l, -2); - - if (!lua_istable (l, -1)) - { - NOTICE ("lua plugin: ltoc_table_values: The \"values\" member is not a table."); - lua_pop (l, /* nelem = */ 1); - return (-1); - } - - vl->values_len = ds->ds_num; - vl->values = calloc ((size_t) vl->values_len, sizeof (*vl->values)); - if (vl->values == NULL) - { - ERROR ("lua plugin: calloc failed."); - vl->values_len = 0; - lua_pop (l, /* nelem = */ 1); - return (-1); - } - - status = ltoc_values (l, ds, vl->values); - - lua_pop (l, /* nelem = */ 1); - - if (status != 0) - { - vl->values_len = 0; - sfree (vl->values); - } - - return (status); -} /* }}} int ltoc_table_values */ - -static int ltoc_string_buffer (lua_State *l, /* {{{ */ - char *buffer, size_t buffer_size, - _Bool consume) -{ - const char *str; - - str = lua_tostring (l, /* stack pos = */ -1); - if (str != NULL) - sstrncpy (buffer, str, buffer_size); - - if (consume) - lua_pop (l, /* nelem = */ 1); - - return ((str != NULL) ? 0 : -1); -} /* }}} int ltoc_string_buffer */ - -static int ltoc_table_string_buffer (lua_State *l, /* {{{ */ - const char *table_key, - char *buffer, size_t buffer_size) -{ - lua_pushstring (l, table_key); - lua_gettable (l, -2); - - if (!lua_isstring (l, /* stack pos = */ -1)) - { - lua_pop (l, /* nelem = */ 1); - return (-1); - } - - return (ltoc_string_buffer (l, buffer, buffer_size, /* consume = */ 1)); -} /* }}} int ltoc_table_string_buffer */ - -static int ltoc_table_cdtime (lua_State *l, /* {{{ */ - const char *table_key, cdtime_t *ret_time) -{ - double d; - - lua_pushstring (l, table_key); - lua_gettable (l, -2); - - if (!lua_isnumber (l, /* stack pos = */ -1)) - { - lua_pop (l, /* nelem = */ 1); - return (-1); - } - - d = (double) lua_tonumber (l, -1); - lua_pop (l, /* nelem = */ 1); - - *ret_time = DOUBLE_TO_CDTIME_T (d); - return (0); -} /* }}} int ltoc_table_cdtime */ - -static value_list_t *ltoc_value_list (lua_State *l) /* {{{ */ -{ - const data_set_t *ds; - value_list_t *vl; - int status; - - vl = malloc (sizeof (*vl)); - if (vl == NULL) - return (NULL); - memset (vl, 0, sizeof (*vl)); - vl->values = NULL; - vl->meta = NULL; - -#define COPY_FIELD(field,def) do { \ - status = ltoc_table_string_buffer (l, #field, vl->field, sizeof (vl->field)); \ - if (status != 0) { \ - if ((def) == NULL) \ - return (NULL); \ - else \ - sstrncpy (vl->field, (def), sizeof (vl->field)); \ - } \ -} while (0) - - COPY_FIELD (host, hostname_g); - COPY_FIELD (plugin, NULL); - COPY_FIELD (plugin_instance, ""); - COPY_FIELD (type, NULL); - COPY_FIELD (type_instance, ""); - -#undef COPY_FIELD - - ds = plugin_get_ds (vl->type); - if (ds == NULL) - { - INFO ("lua plugin: Unable to lookup type \"%s\".", vl->type); - sfree (vl); - return (NULL); - } - - status = ltoc_table_cdtime (l, "time", &vl->time); - if (status != 0) - vl->time = cdtime (); - - status = ltoc_table_cdtime (l, "interval", &vl->interval); - if (status != 0) - vl->interval = interval_g; - - status = ltoc_table_values (l, ds, vl); - if (status != 0) - { - WARNING ("lua plugin: ltoc_table_values failed."); - sfree (vl); - return (NULL); - } - - return (vl); -} /* }}} value_list_t *ltoc_value_list */ - /* * Exported functions */ @@ -382,11 +176,11 @@ static int lua_cb_dispatch_values (lua_State *l) /* {{{ */ if (!lua_istable (l, 1)) { WARNING ("lua plugin: The first argument to collectd_dispatch_values() " - "must be a table."); + "must be a \"value list\" (i.e. a table)."); RETURN_LUA (l, -1); } - vl = ltoc_value_list (l); + vl = luaC_tovaluelist (l, /* idx = */ -1); if (vl == NULL) { WARNING ("lua plugin: ltoc_value_list failed.");