X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=1a89681d196bce31b863e390bd60fc62f441a886;hp=620367e5f52c0dfd5ff1597e4d688563fa6b546b;hb=2779091949f95ea3d0231ebe131e78f907963897;hpb=0c5e3f4c2f95d6a73bf840bc82dd0a1ce91e4016 diff --git a/gui.c b/gui.c index 620367e5..1a89681d 100644 --- a/gui.c +++ b/gui.c @@ -871,6 +871,23 @@ static void parse_config_file_or_die(bool override) } goto out; } + /* + * When the gengetopt config file parser is called more than once, any + * key map arguments found in the config file are _appended_ to the old + * values, even though we turn on ->override. We want the new arguments + * to replace the old ones, so we must empty the key_map_arg array + * first. Unfortunately, this also clears any key map arguments given + * at the command line. + */ + if (override) { + int i; + for (i = 0; i < conf.key_map_given; i++) { + free(conf.key_map_arg[i]); + conf.key_map_arg[i] = NULL; + } + conf.key_map_given = 0; + } + gui_cmdline_parser_config_file(config_file, &conf, ¶ms); loglevel = get_loglevel_by_name(conf.loglevel_arg); check_key_map_args_or_die(); @@ -1406,7 +1423,7 @@ static int setup_tasks_and_schedule(void) struct exec_task exec_task = {.task = NULL}; struct status_task status_task = {.fd = -1}; struct input_task input_task = {.task = NULL}; - struct signal_task signal_task = {.task = NULL}; + struct signal_task *signal_task; struct sched sched = { .default_timeout = { .tv_sec = conf.timeout_arg / 1000, @@ -1435,19 +1452,20 @@ static int setup_tasks_and_schedule(void) .context = &input_task, }, &sched); - signal_task.fd = para_signal_init(); + signal_task = signal_init_or_die(); para_install_sighandler(SIGINT); para_install_sighandler(SIGTERM); para_install_sighandler(SIGCHLD); para_install_sighandler(SIGUSR1); - signal_task.task = task_register(&(struct task_info) { + signal_task->task = task_register(&(struct task_info) { .name = "signal", .pre_select = signal_pre_select, .post_select = signal_post_select, - .context = &signal_task, + .context = signal_task, }, &sched); ret = schedule(&sched); sched_shutdown(&sched); + signal_shutdown(signal_task); return ret; }