// Called from lua to stop listening to a particular event static int addon_output_event_listen_stop(lua_State *L) { // Args should be : // 1) self // 2) event name // Find the event const char *evt_name = luaL_checkstring(L, 2); struct event_reg *evt = event_find(evt_name); if (!evt) luaL_error(L, "Event %s does not exists", evt_name); // Get the output struct addon_instance_priv *p = addon_output_get_priv(L, 1); if (event_listener_unregister(evt, p) != POM_OK) luaL_error(L, "Error while unregistering event listener"); // Forget about listening to the event lua_pushlightuserdata(L, evt); lua_pushnil(L); lua_settable(L, 1); return 0; }
static int analyzer_smtp_event_listeners_notify(void *obj, struct event_reg *evt_reg, int has_listeners) { struct analyzer *analyzer = obj; struct analyzer_smtp_priv *priv = analyzer->priv; if (evt_reg == priv->evt_msg) { if (has_listeners) { priv->pkt_listener = proto_packet_listener_register(proto_get("smtp"), PROTO_PACKET_LISTENER_PLOAD_ONLY, obj, analyzer_smtp_pkt_process, NULL); if (!priv->pkt_listener) return POM_ERR; } else { if (proto_packet_listener_unregister(priv->pkt_listener) != POM_OK) return POM_ERR; priv->pkt_listener = NULL; } } if (!priv->listening && (event_has_listener(priv->evt_msg) || event_has_listener(priv->evt_auth))) { if (event_listener_register(priv->evt_cmd, analyzer, analyzer_smtp_event_process_begin, analyzer_smtp_event_process_end) != POM_OK) { return POM_ERR; } else if (event_listener_register(priv->evt_reply, analyzer, analyzer_smtp_event_process_begin, analyzer_smtp_event_process_end) != POM_OK) { event_listener_unregister(priv->evt_cmd, analyzer); return POM_ERR; } priv->listening = 1; } else if (priv->listening && !event_has_listener(priv->evt_msg) && !event_has_listener(priv->evt_auth)) { event_listener_unregister(priv->evt_cmd, analyzer); event_listener_unregister(priv->evt_reply, analyzer); priv->listening = 0; } return POM_OK; }
int analyzer_ppp_pap_event_listeners_notify(void *obj, struct event_reg *evt_reg, int has_listeners) { struct analyzer *analyzer = obj; struct analyzer_ppp_pap_priv *priv = analyzer->priv; if (has_listeners) { if (event_listener_register(priv->evt_request, analyzer, analyzer_ppp_pap_event_process_begin, NULL, NULL) != POM_OK) { return POM_ERR; } else if (event_listener_register(priv->evt_ack_nack, analyzer, analyzer_ppp_pap_event_process_begin, NULL, NULL) != POM_OK) { event_listener_unregister(priv->evt_request, analyzer); return POM_ERR; } } else { if (event_listener_unregister(priv->evt_request, analyzer) != POM_OK || event_listener_unregister(priv->evt_ack_nack, analyzer) != POM_OK) return POM_ERR; } return POM_OK; }
int analyzer_eap_event_listeners_notify(void *obj, struct event_reg *evt_reg, int has_listeners) { struct analyzer *analyzer = obj; struct analyzer_eap_priv *priv = analyzer->priv; if (event_has_listener(priv->evt_md5_auth)) { if (event_listener_register(priv->evt_md5_challenge, analyzer, analyzer_eap_event_process_begin, NULL) != POM_OK) { return POM_ERR; } else if (event_listener_register(priv->evt_success_failure, analyzer, analyzer_eap_event_process_begin, NULL) != POM_OK) { event_listener_unregister(priv->evt_md5_challenge, analyzer); return POM_ERR; } } else { if (event_listener_unregister(priv->evt_md5_challenge, analyzer) != POM_OK || event_listener_unregister(priv->evt_success_failure, analyzer) != POM_OK) return POM_ERR; } return POM_OK; }
static int analyzer_smtp_cleanup(struct analyzer *analyzer) { struct analyzer_smtp_priv *priv = analyzer->priv; if (priv->pkt_listener) { proto_packet_listener_unregister(priv->pkt_listener); } if (priv->listening) { event_listener_unregister(priv->evt_cmd, analyzer); event_listener_unregister(priv->evt_reply, analyzer); } if (priv->evt_msg) event_unregister(priv->evt_msg); if (priv->evt_auth) event_unregister(priv->evt_auth); free(priv); return POM_OK; }
int output_log_xml_close(void *output_priv) { struct output_log_xml_priv *priv = output_priv; if (addon_log_xml_close(priv) != POM_OK) return POM_ERR; while (priv->evt_lst) { struct output_log_xml_evt *tmp = priv->evt_lst; priv->evt_lst = tmp->next; event_listener_unregister(tmp->evt, priv); free(tmp); } return POM_OK; }
int event_payload_listen_stop() { if (!event_pload_listener_ref) { pomlog(POMLOG_ERR, "Payload listener not started yet !"); return POM_ERR; } event_pload_listener_ref--; if (event_pload_listener_ref) return POM_OK; struct event_reg *tmp; for (tmp = event_reg_head; tmp; tmp = tmp->next) { if (!(tmp->info->flags & EVENT_REG_FLAG_PAYLOAD)) continue; event_listener_unregister(tmp, &event_pload_listener_ref); } return POM_OK; }