X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=write.c;h=c12736a66bfb81c9dcf85c412b1a581a2cade0ce;hp=78e48dcdaf5637acf5754a00553a28c5d647284e;hb=bc086fe5537bd3078b920454958b61287a75c568;hpb=591b16bbe13ca336c4cef00e8f9f808c1bb4c9a0 diff --git a/write.c b/write.c index 78e48dcd..c12736a6 100644 --- a/write.c +++ b/write.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2008 Andre Noll + * Copyright (C) 2005-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -14,6 +14,7 @@ #include "write.cmdline.h" #include "list.h" #include "sched.h" +#include "ggo.h" #include "stdin.h" #include "write.h" #include "write_common.h" @@ -106,17 +107,23 @@ static void initial_delay_pre_select(struct sched *s, struct task *t) if (!idt->start_time.tv_sec && !idt->start_time.tv_usec) { t->error = -E_NO_DELAY; - return; + goto register_check_wav; } if (tv_diff(now, &idt->start_time, &diff) > 0) { t->error = -E_DELAY_TIMEOUT; - return; + goto register_check_wav; } if (tv_diff(&s->timeout , &diff, NULL) > 0) s->timeout = diff; + return; +register_check_wav: + register_task(&the_check_wav_task.task); + s->timeout.tv_sec = 0; + s->timeout.tv_usec = 1; } -INIT_STDERR_LOGGING(conf.loglevel_arg) +static int loglevel; +INIT_STDERR_LOGGING(loglevel) static struct writer_node_group *check_args(void) { @@ -124,20 +131,7 @@ static struct writer_node_group *check_args(void) struct writer_node_group *g = NULL; struct initial_delay_task *idt = &the_initial_delay_task; - if (conf.list_writers_given) { - char *msg = NULL; - FOR_EACH_WRITER(i) { - char *tmp = make_message("%s%s%s", - i? msg : "", - i? " " : "", - writer_names[i]); - free(msg); - msg = tmp; - } - fprintf(stderr, "%s\n", msg); - free(msg); - exit(EXIT_SUCCESS); - } + loglevel = get_loglevel_by_name(conf.loglevel_arg); if (conf.start_time_given) { long unsigned sec, usec; if (sscanf(conf.start_time_arg, "%lu:%lu", @@ -159,7 +153,7 @@ static struct writer_node_group *check_args(void) conf.writer_arg[i], &writer_num); if (!g->writer_nodes[i].conf) goto out; - g->writer_nodes[i].writer = &writers[writer_num]; + g->writer_nodes[i].writer_num = writer_num; } ret = 1; out: @@ -169,6 +163,21 @@ out: return NULL; } +__noreturn static void print_help_and_die(void) +{ + int d = conf.detailed_help_given; + const char **p = d? write_args_info_detailed_help + : write_args_info_help; + + printf_or_die("%s\n\n", WRITE_CMDLINE_PARSER_PACKAGE "-" + WRITE_CMDLINE_PARSER_VERSION); + printf_or_die("%s\n\n", write_args_info_usage); + for (; *p; p++) + printf_or_die("%s\n", *p); + print_writer_helps(d); + exit(0); +} + /** * Para_write's main function. * @@ -187,19 +196,25 @@ int main(int argc, char *argv[]) struct check_wav_task *cwt = &the_check_wav_task; struct initial_delay_task *idt = &the_initial_delay_task; + writer_init(); write_cmdline_parser(argc, argv, &conf); HANDLE_VERSION_FLAG("write", conf); - init_supported_writers(); + if (conf.help_given || conf.detailed_help_given) + print_help_and_die(); wng = check_args(); if (!wng) goto out; stdin_set_defaults(&sit); - if (conf.bufsize_given) - sit.bufsize = conf.bufsize_arg; + ret = -ERRNO_TO_PARA_ERROR(EINVAL); + if (conf.bufsize_arg < 0) + goto out; + if (conf.bufsize_arg >= INT_MAX / 1024) + goto out; + sit.bufsize = conf.bufsize_arg * 1024; sit.buf = para_malloc(sit.bufsize); - wng->buf = sit.buf; + wng->bufp = &sit.buf; wng->loaded = &sit.loaded; wng->input_error = &sit.task.error; @@ -210,7 +225,6 @@ int main(int argc, char *argv[]) cwt->input_error = &sit.task.error; sprintf(cwt->task.status, "check wav"); cwt->task.pre_select = check_wav_pre_select; - register_task(&cwt->task); idt->task.pre_select = initial_delay_pre_select; sprintf(idt->task.status, "initial_delay");