#include "error.h"
#include "version.h"
+/** Array of error strings. */
+DEFINE_PARA_ERRLIST;
+
/** The list of all status items used by para_{server,audiod,gui}. */
const char *status_item_list[] = {STATUS_ITEM_ARRAY};
*/
char *stat_item_values[NUM_STAT_ITEMS] = {NULL};
-/** Initialize the array of errors for para_filter. */
-INIT_FILTER_ERRLISTS;
-
/** The task that reads from stdin. */
static struct stdin_task stdin_task_struct;
/** pointer to the stdin task. */
bool d = conf.detailed_help_given;
ggo_print_help(&h, d? GPH_STANDARD_FLAGS_DETAILED : GPH_STANDARD_FLAGS);
- print_filter_helps(d? GPH_MODULE_FLAGS_DETAILED : GPH_MODULE_FLAGS);
- exit(0);
+ print_filter_helps(d);
+ exit(EXIT_SUCCESS);
}
static int parse_config(void)
const struct filter *f;
struct btr_node *parent;
struct filter_node **fns;
+ struct lls_parse_result *filter_lpr;
filter_cmdline_parser(argc, argv, &conf); /* aborts on errors */
loglevel = get_loglevel_by_name(conf.loglevel_arg);
- filter_init();
ret = parse_config();
if (ret < 0)
goto out;
fns = para_malloc(conf.filter_given * sizeof(*fns));
for (i = 0, parent = sit->btrn; i < conf.filter_given; i++) {
char *fa = conf.filter_arg[i];
+ const char *name;
struct filter_node *fn;
struct task_info ti;
fn = fns[i] = para_calloc(sizeof(*fn));
- ret = check_filter_arg(fa, &fn->conf);
- if (ret < 0) {
- free(fn);
- goto out_cleanup;
- }
- fn->filter_num = ret;
+ fn->filter_num = filter_setup(fa, &fn->conf, &filter_lpr);
+ name = filter_name(fn->filter_num);
+ fn->lpr = filter_lpr;
+ PARA_DEBUG_LOG("filter #%d: %s\n", i, name);
f = filter_get(fn->filter_num);
- PARA_DEBUG_LOG("filter #%d: %s\n", i, f->name);
fn->btrn = btr_new_node(&(struct btr_node_description)
- EMBRACE(.name = f->name, .parent = parent,
+ EMBRACE(.name = name, .parent = parent,
.handler = f->execute, .context = fn));
- ti.name = f->name;
+ ti.name = name;
ti.pre_select = f->pre_select;
ti.post_select = f->post_select;
ti.context = fn;
- f->open(fn);
+ if (f->open)
+ f->open(fn);
fn->task = task_register(&ti, &s);
parent = fn->btrn;
}
btr_log_tree(sit->btrn, LL_INFO);
ret = schedule(&s);
sched_shutdown(&s);
-out_cleanup:
for (i--; i >= 0; i--) {
struct filter_node *fn = fns[i];
if (f->close)
f->close(fn);
btr_remove_node(&fn->btrn);
- if (f->free_config)
- f->free_config(fn->conf);
+ if (f->teardown)
+ f->teardown(fn->lpr, fn->conf);
free(fn);
}
free(fns);