From: Andre Noll Date: Thu, 31 Dec 2009 18:37:29 +0000 (+0100) Subject: write_common: Introduce and use setup_writer_node(). X-Git-Tag: v0.4.2~220 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=885700289d2c7ab64c3bc5a5ab8f6aba14e27632;hp=e1c7483ab86de8a2e84c4aa6fc9116faba4ccfcf write_common: Introduce and use setup_writer_node(). This makes para_write with no options work again. --- diff --git a/write.c b/write.c index c76b6c46..c3848946 100644 --- a/write.c +++ b/write.c @@ -299,37 +299,35 @@ static int main_btr(struct sched *s) cwt->task.error = 0; register_task(&cwt->task); - wns = para_malloc(conf.writer_given * sizeof(*wns)); + PARA_CRIT_LOG("writers:\n"); - for (i = 0; i < conf.writer_given; i++) { - struct writer_node *wn = para_calloc(sizeof(*wn)); - struct writer *w; - const char *name; - - ret = -E_WRITE_SYNTAX; - wn->conf = check_writer_arg(conf.writer_arg[i], - &wn->writer_num); - if (!wn->conf) + ret = -E_WRITE_SYNTAX; + if (!conf.writer_given) { + i = 0; + wns = para_malloc(sizeof(*wns)); + wns[0] = setup_writer_node(NULL, cwt->btrn); + if (!wns[0]) goto out; - w = writers + wn->writer_num; - name = writer_names[wn->writer_num]; - wn->btrn = btr_new_node(name, cwt->btrn, w->execute, wn); - sprintf(wn->task.status, "%s", name); - w->open(wn); - wn->task.post_select = w->post_select_btr; - wn->task.pre_select = w->pre_select_btr; - register_task(&wn->task); - wns[i] = wn; + } else { + wns = para_malloc(conf.writer_given * sizeof(*wns)); + for (i = 0; i < conf.writer_given; i++) { + PARA_CRIT_LOG("i: %d\n", i); + wns[i] = setup_writer_node(conf.writer_arg[i], + cwt->btrn); + if (!wns[i]) + goto out; + } } - i--; s->default_timeout.tv_sec = 10; s->default_timeout.tv_usec = 50000; ret = schedule(s); out: - for (; i >= 0; i--) { + for (i--; i >= 0; i--) { struct writer_node *wn = wns[i]; - free(wn->conf); + struct writer *w = writers + wn->writer_num; + w->close(wn); + free(wn->conf); /* FIXME should call gengetopt cleanup funtion */ free(wn); } free(wns); diff --git a/write_common.c b/write_common.c index 8e4d5aa6..7c0d9521 100644 --- a/write_common.c +++ b/write_common.c @@ -236,6 +236,51 @@ struct writer_node_group *setup_default_wng(void) wng->writer_nodes[0].conf = writers[DEFAULT_WRITER].parse_config(""); return wng; } + +/** + * Setup a writer node with the default writer. + * + * If arg is \p NULL, the OS-dependent default writer is used with an empty + * configuration string. It defaults to alsa for Linux, osx for OS X, oss for + * *BSD and the file writer if neither of these is supported. + * + * Once the writer configuration has been retrieved, a writer node is created, + * its buffer tree node is added to the buffer tree as a child of the given + * parent. + * + * Finally, the new writer node's taks structure is initialized and registered + * to the paraslash scheduler. + * + * \return A pointer to the allocated writer node group. + */ +struct writer_node *setup_writer_node(const char *arg, struct btr_node *parent) +{ + struct writer_node *wn = para_calloc(sizeof(*wn)); + struct writer *w; + const char *name; + + if (arg) + wn->conf = check_writer_arg(arg, &wn->writer_num); + else { + wn->writer_num = DEFAULT_WRITER; + wn->conf = writers[DEFAULT_WRITER].parse_config(""); + } + if (!wn->conf) { + free(wn); + return NULL; + } + w = writers + wn->writer_num; + name = writer_names[wn->writer_num]; + wn->btrn = btr_new_node(name, parent, w->execute, wn); + sprintf(wn->task.status, "%s", name); + w->open(wn); + wn->task.post_select = w->post_select_btr; + wn->task.pre_select = w->pre_select_btr; + register_task(&wn->task); + return wn; +} + + /** * Print the help text of all writers to stdout. * diff --git a/write_common.h b/write_common.h index 5edebe11..f34ad3fe 100644 --- a/write_common.h +++ b/write_common.h @@ -13,3 +13,4 @@ void writer_init(void); void *check_writer_arg(const char *wa, int *writer_num); struct writer_node_group *setup_default_wng(void); void print_writer_helps(int detailed); +struct writer_node *setup_writer_node(const char *arg, struct btr_node *parent);