- struct writer_node *wn = para_malloc(sizeof(*wn));
- struct writer *w = writers + DEFAULT_WRITER;
- int ret;
-
- wn->writer_num = DEFAULT_WRITER;
- wn->conf = writers[DEFAULT_WRITER].parse_config("-B");
- sit.btrn = btr_new_node("stdin", NULL /* stdin has no parent */, NULL);
- stdin_set_defaults(&sit);
- register_task(&sit.task);
-
- wn->btrn = btr_new_node("writer", sit.btrn, NULL);
-
- sprintf(wn->task.status, "some writer");
- w->open(wn);
- wn->task.post_select = w->post_select_btr;
- wn->task.pre_select = w->pre_select_btr;
- register_task(&wn->task);
-
- s->default_timeout.tv_sec = 10;
- s->default_timeout.tv_usec = 50000;
- ret = schedule(s);
- w->close(wn);
+ int i, n, ret, writer_given = OPT_GIVEN(WRITER, lpr);
+ struct btr_node *cw_btrn;
+ struct writer_node *wns;
+ static struct sched s;
+ struct wav_params wp;
+ struct write_task wt;
+
+ sit.btrn = btr_new_node(&(struct btr_node_description)
+ EMBRACE(.name = "stdin"));
+ stdin_task_register(&sit, &s);
+
+ LLS_COPY_WAV_PARMS(&wp, LSG_WRITE_PARA_WRITE, lpr);
+ wt.cwc = check_wav_init(sit.btrn, NULL, &wp, &cw_btrn);
+ wt.task = task_register(&(struct task_info) {
+ .name = "write",
+ .pre_select = write_pre_select,
+ .post_select = write_post_select,
+ .context = &wt,
+ }, &s);
+
+ n = writer_given? writer_given : 1;
+ wns = para_calloc(n * sizeof(*wns));
+ for (i = 0; i < n; i++) {
+ const char *arg = i < writer_given?
+ lls_string_val(i, OPT_RESULT(WRITER, lpr)) : NULL;
+ wns[i].wid = check_writer_arg_or_die(arg, &wns[i].lpr);
+ register_writer_node(wns + i, cw_btrn, &s);
+ }
+ s.default_timeout.tv_sec = 10;
+ s.default_timeout.tv_usec = 50000;
+ ret = schedule(&s);
+ if (ret >= 0) {
+ int j, ts;
+ for (j = 0; j < n; j++) {
+ struct writer_node *wn = wns + j;
+ ts = task_status(wn->task);
+ assert(ts < 0);
+ if (ts != -E_WRITE_COMMON_EOF && ts != -E_BTR_EOF) {
+ const char *name = writer_name(wn->wid);
+ PARA_ERROR_LOG("%s: %s\n", name,
+ para_strerror(-ts));
+ if (ret >= 0)
+ ret = ts;
+ }
+ }
+ }
+ for (i = n - 1; i >= 0; i--) {
+ struct writer_node *wn = wns + i;
+ writer_get(wn->wid)->close(wn);
+ btr_remove_node(&wn->btrn);
+ lls_free_parse_result(wns[i].lpr,
+ lls_cmd(wn->wid, write_cmd_suite));
+ }
+ free(wns);
+ check_wav_shutdown(wt.cwc);
+ sched_shutdown(&s);