audioc: Fix memory leak in configfile_exists().
[paraslash.git] / write.c
diff --git a/write.c b/write.c
index 9762c40cd8e2b85dab8e0281eed1adc4c5acae86..a8e2429ce0f8a659492e3f29fcf4d504318fce4d 100644 (file)
--- a/write.c
+++ b/write.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2012 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -8,7 +8,6 @@
 
 #include <regex.h>
 #include <sys/types.h>
-#include <stdbool.h>
 
 #include "para.h"
 #include "string.h"
@@ -185,32 +184,30 @@ __noreturn static void print_help_and_die(void)
  *
  * \return Standard.
  */
-static int setup_writer_node(const char *arg, struct btr_node *parent,
-               struct writer_node *wn)
+static void setup_writer_node(const char *arg, struct btr_node *parent,
+               struct writer_node *wn, struct sched *s)
 {
        if (arg)
-               wn->conf = check_writer_arg(arg, &wn->writer_num);
+               wn->conf = check_writer_arg_or_die(arg, &wn->writer_num);
        else {
                wn->writer_num = DEFAULT_WRITER;
                wn->conf = writers[DEFAULT_WRITER].parse_config_or_die("");
        }
-       if (!wn->conf)
-               return -E_WRITE_COMMON_SYNTAX;
-       register_writer_node(wn, parent);
-       return 1;
+       register_writer_node(wn, parent, s);
 }
 
-static int main_btr(struct sched *s)
+static int setup_and_schedule(void)
 {
        int i, ret;
        struct check_wav_task _cwt, *cwt = &_cwt;
        struct writer_node *wns;
+       static struct sched s;
 
        loglevel = get_loglevel_by_name(conf.loglevel_arg);
        sit.btrn = btr_new_node(&(struct btr_node_description)
                EMBRACE(.name = "stdin"));
        stdin_set_defaults(&sit);
-       register_task(&sit.task);
+       register_task(&s, &sit.task);
 
        cwt->state = CWS_NEED_HEADER;
        cwt->min_iqs = WAV_HEADER_LEN;
@@ -221,29 +218,22 @@ static int main_btr(struct sched *s)
        cwt->task.pre_select = check_wav_pre_select;
        cwt->task.post_select = check_wav_post_select;
        cwt->task.error = 0;
-       register_task(&cwt->task);
+       register_task(&s, &cwt->task);
 
-       ret = -E_WRITE_SYNTAX;
        if (!conf.writer_given) {
-               i = 0;
                wns = para_calloc(sizeof(*wns));
-               ret = setup_writer_node(NULL, cwt->btrn, wns);
-               if (ret < 0)
-                       goto out;
+               setup_writer_node(NULL, cwt->btrn, wns, &s);
                i = 1;
        } else {
                wns = para_calloc(conf.writer_given * sizeof(*wns));
-               for (i = 0; i < conf.writer_given; i++) {
-                       ret = setup_writer_node(conf.writer_arg[i],
-                               cwt->btrn, wns + i);
-                       if (ret < 0)
-                               goto out;
-               }
+               for (i = 0; i < conf.writer_given; i++)
+                       setup_writer_node(conf.writer_arg[i], cwt->btrn,
+                               wns + i, &s);
        }
 
-       s->default_timeout.tv_sec = 10;
-       s->default_timeout.tv_usec = 50000;
-       ret = schedule(s);
+       s.default_timeout.tv_sec = 10;
+       s.default_timeout.tv_usec = 50000;
+       ret = schedule(&s);
        if (ret >= 0) {
                int j;
                for (j = 0; j < i; j++) {
@@ -258,7 +248,6 @@ static int main_btr(struct sched *s)
                        }
                }
        }
-out:
        for (i--; i >= 0; i--) {
                struct writer_node *wn = wns + i;
                struct writer *w = writers + wn->writer_num;
@@ -286,8 +275,7 @@ out:
  */
 int main(int argc, char *argv[])
 {
-       int ret = -E_WRITE_SYNTAX;
-       static struct sched s;
+       int ret;
 
        writer_init();
        write_cmdline_parser(argc, argv, &conf);
@@ -295,7 +283,7 @@ int main(int argc, char *argv[])
        if (conf.help_given || conf.detailed_help_given)
                print_help_and_die();
 
-       ret = main_btr(&s);
+       ret = setup_and_schedule();
        if (ret < 0) {
                PARA_ERROR_LOG("%s\n", para_strerror(-ret));
                exit(EXIT_FAILURE);