static int analyzer_docsis_cleanup(struct analyzer *analyzer) { struct analyzer_docsis_priv *priv = analyzer->priv; pthread_mutex_destroy(&priv->lock); if (priv->evt_cm_new) event_unregister(priv->evt_cm_new); if (priv->evt_cm_reg_status) event_unregister(priv->evt_cm_reg_status); if (priv->filter) filter_cleanup(priv->filter); int i; for (i = 0; i < ANALYZER_DOCSIS_CM_TABLE_SIZE; i++) { while (priv->cms[i]) { struct analyzer_docsis_cm *tmp = priv->cms[i]; priv->cms[i] = tmp->next; free(tmp); } } free(priv); return POM_OK; }
struct filter *packet_filter_compile(char *filter_expr) { struct filter *f = filter_alloc(packet_filter_prop_compile, NULL, packet_filter_prop_get_val, packet_filter_prop_cleanup); if (!f) return NULL; if (filter_compile(filter_expr, f) != POM_OK) { filter_cleanup(f); return NULL; } return f; }
static int output_inject_filter_parse(void *priv, struct registry_param *param, char *value) { struct output_inject_priv *p = priv; if (p->filter) { filter_cleanup(p->filter); p->filter = NULL; } if (!strlen(value)) return POM_OK; p->filter = packet_filter_compile(value); if (!p->filter) return POM_ERR; return POM_OK; }
/* Terminate the child process. Do nothing if it already exited. */ static void filter_terminate (struct pipe_filter_gi *filter) { if (!filter->exited) { /* Tell the child there is nothing more the parent will send. */ close (filter->fd[1]); filter_cleanup (filter, !filter->reader_terminated); close (filter->fd[0]); filter->exitstatus = wait_subprocess (filter->child, filter->progname, true, filter->null_stderr, true, filter->exit_on_error, NULL); if (filter->exitstatus != 0 && filter->exit_on_error) error (EXIT_FAILURE, 0, _("subprocess %s terminated with exit code %d"), filter->progname, filter->exitstatus); filter->exited = true; } }
int output_file_open(void *output_priv) { struct output_file_priv *priv = output_priv; char *filter_str = PTYPE_STRING_GETVAL(priv->p_filter); struct filter *filter = NULL; if (strlen(filter_str)) { filter = pload_filter_compile(filter_str); if (!filter) { pomlog(POMLOG_ERR "Error while parsing filter '%s'", filter_str); return POM_ERR; } } char *listen_pload_evt = PTYPE_BOOL_GETVAL(priv->p_listen_pload_evt); if (*listen_pload_evt && event_payload_listen_start() != POM_OK) { if (filter) filter_cleanup(filter); return POM_ERR; } return pload_listen_start(output_priv, NULL, filter, output_file_pload_open, output_file_pload_write, output_file_pload_close); }