static void __init ascii_init(void) { c_fd = stdout; c_format = strdup("$(element:name) $(attr:rx:bytes) $(attr:tx:bytes) " \ "$(attr:rx:packets) $(attr:tx:packets)\\n"); output_register(&format_ops); }
// Called from C to register all the outputs after the lua file was executed int addon_output_register_all(struct addon *addon) { lua_getfield(addon->L, LUA_REGISTRYINDEX, ADDON_OUTPUTS_TABLE); // Stack : outputs lua_pushnil(addon->L); // Stack : outputs, nil while (lua_next(addon->L, -2)) { // Stack : outputs, name, output // Key is the name of the output const char *name = lua_tostring(addon->L, -2); pomlog(POMLOG_DEBUG "Registering addon output %s ...", name); lua_getfield(addon->L, -1, "__descr"); // Stack : outputs, name, output, __descr const char *descr = lua_tostring(addon->L, -1); lua_pop(addon->L, 1); struct output_reg_info *output_info = lua_newuserdata(addon->L, sizeof(struct output_reg_info)); // Stack : outputs, name, output, output_info memset(output_info, 0, sizeof(struct output_reg_info)); // Add the output_reg metatable luaL_getmetatable(addon->L, ADDON_OUTPUT_REG_METATABLE); // Stack : outputs, name, output, output_info, metatable lua_setmetatable(addon->L, -2); // Stack : outputs, name, output, output_info output_info->name = strdup(name); if (!output_info->name) addon_oom(addon->L, strlen(name) + 1); output_info->description = strdup(descr); if (!output_info->description) { free(output_info->name); addon_oom(addon->L, strlen(descr) + 1); } output_info->mod = addon->mod; output_info->init = addon_output_init; output_info->open = addon_output_open; output_info->close = addon_output_close; output_info->cleanup = addon_output_cleanup; if (output_register(output_info) != POM_OK) luaL_error(addon->L, "Error while registering addon input %s", name); // Add the info to the class, we need to keep a copy of that so lua is a perfect location to store it lua_setfield(addon->L, -2, "__info"); // Stack : outputs, name, output lua_pop(addon->L, 1); // Stack : outputs, name pomlog(POMLOG_DEBUG "Registered addon output %s", name); } lua_pop(addon->L, 1); // Stack : empty return 0; }
static int output_inject_mod_register(struct mod_reg *mod) { static struct output_reg_info output_inject; memset(&output_inject, 0, sizeof(struct output_reg_info)); output_inject.name = "inject"; output_inject.description = "Inject packets on an interface"; output_inject.mod = mod; output_inject.init = output_inject_init; output_inject.open = output_inject_open; output_inject.close = output_inject_close; output_inject.cleanup = output_inject_cleanup; return output_register(&output_inject); }
int output_tap_mod_register(struct mod_reg *mod) { static struct output_reg_info output_tap = { 0 }; output_tap.name = "tap"; output_tap.description = "Send packets to a virtual tap interface"; output_tap.mod = mod; output_tap.init = output_tap_init; output_tap.open = output_tap_open; output_tap.close = output_tap_close; output_tap.cleanup = output_tap_cleanup; static struct addon_plugin_pload_reg addon_tap = { 0 }; addon_tap.name = "tap"; addon_tap.mod = mod; addon_tap.open = output_tap_open; addon_tap.close = output_tap_close; static struct addon_pload_param_reg params[] = { { "ifname", "string" }, { "persistent", "bool" }, { "filter", "string" }, { 0 } }; addon_tap.pload_params = params; if (output_register(&output_tap) != POM_OK || addon_plugin_pload_register(&addon_tap) != POM_OK) { output_tap_mod_unregister(); return POM_ERR; } return POM_OK; }
int output_file_mod_register(struct mod_reg *mod) { static struct output_reg_info output_file = { 0 }; output_file.name = "file"; output_file.api_ver = OUTPUT_API_VER; output_file.mod = mod; output_file.init = output_file_init; output_file.open = output_file_open; output_file.close = output_file_close; output_file.cleanup = output_file_cleanup; static struct addon_plugin_pload_reg addon_file = { 0 }; addon_file.name = "file"; addon_file.mod = mod; addon_file.pload_open = addon_file_pload_open; addon_file.pload_write = output_file_pload_write; addon_file.pload_close = output_file_pload_close; static struct addon_pload_param_reg params[] = { { "filename", "string" }, { 0 } }; addon_file.pload_params = params; if (output_register(&output_file) != POM_OK || addon_plugin_pload_register(&addon_file) != POM_OK) { output_file_mod_unregister(); return POM_ERR; } return POM_OK; }