X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=audiod.c;h=5aa32de5dd5798171e8e3c5f88e6e74ccc5e28c6;hb=0fab5d5201804efe0177e4a6ea3f17864431c5f1;hp=40c75952570eb60c09ddf7904eda43cc37f90108;hpb=d42af6d28fa44d085b048cb064e20c79189b88b2;p=paraslash.git diff --git a/audiod.c b/audiod.c index 40c75952..5aa32de5 100644 --- a/audiod.c +++ b/audiod.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2006 Andre Noll + * Copyright (C) 2005-2007 Andre Noll * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,6 +37,7 @@ #include "write.h" #include "write_common.h" #include "error.h" +#include "signal.h" /** define the array of error lists needed by para_audiod */ INIT_AUDIOD_ERRLISTS; @@ -493,7 +494,7 @@ static void compute_time_diff(const struct timeval *status_time) sa_time_diff_sign = sign; stat_task->sa_time_diff = diff; count++; - return; + goto out; } if (count > 5) { int s = tv_diff(&diff, &stat_task->sa_time_diff, &tmp); @@ -513,6 +514,8 @@ static void compute_time_diff(const struct timeval *status_time) sa_time_diff_sign ? "+" : "-", tv2ms(&stat_task->sa_time_diff) ); +out: + stat_task->sa_time_diff_sign = sa_time_diff_sign; } static void check_stat_line(char *line) @@ -978,33 +981,27 @@ static void init_command_task(struct command_task *ct) static void client_task_event_handler(__a_unused struct task *t) { struct private_client_data *pcd = t->private_data; + int i; + struct timeval delay = {1, 0}; + if (t->ret == -E_HANDSHAKE_COMPLETE) return; unregister_task(t); - pcd->eof = 1; -} - -static void status_event_handler(__a_unused struct task *t) -{ - struct timeval delay = {1, 0}; - int i; - struct status_task *st = t->private_data; - - PARA_ERROR_LOG("%s\n", PARA_STRERROR(-t->ret)); close_stat_pipe(); + if (t->ret != -E_SERVER_EOF) + stat_task->clock_diff_count = conf.clock_diff_count_arg; /* avoid busy loop if server is down */ - tv_add(now, &delay, &st->restart_barrier); + tv_add(now, &delay, &stat_task->restart_barrier); FOR_EACH_AUDIO_FORMAT(i) - afi[i].restart_barrier = st->restart_barrier; + afi[i].restart_barrier = stat_task->restart_barrier; } static void status_pre_select(struct sched *s, struct task *t) { struct status_task *st = t->private_data; + int ret; - t->ret = 1; - if (st->pcd && (audiod_status == AUDIOD_OFF || st->pcd->eof)) - close_stat_pipe(); + t->ret = 1; /* always successful */ if (st->pcd || audiod_status == AUDIOD_OFF) return; if (!st->clock_diff_count && tv_diff(now, &st->restart_barrier, NULL) @@ -1016,18 +1013,14 @@ static void status_pre_select(struct sched *s, struct task *t) if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0) return; PARA_INFO_LOG("clock diff count: %d\n", st->clock_diff_count); - t->ret = client_parse_config(argc, argv, &st->pcd); + ret = client_open(argc, argv, &st->pcd); } else { char *argv[] = {"audiod", "stat", NULL}; int argc = 2; - t->ret = client_parse_config(argc, argv, &st->pcd); + ret = client_open(argc, argv, &st->pcd); } - - if (t->ret < 0) - return; - t->ret = client_open(st->pcd); - if (t->ret < 0) + if (ret < 0) return; st->pcd->task.event_handler = client_task_event_handler; s->timeout.tv_sec = 0; @@ -1042,6 +1035,12 @@ static void status_post_select(__a_unused struct sched *s, struct task *t) t->ret = 1; if (!st->pcd || st->pcd->status != CL_RECEIVING) return; + if (st->pcd && audiod_status == AUDIOD_OFF) { + unregister_task(&st->pcd->task); + close_stat_pipe(); + st->clock_diff_count = conf.clock_diff_count_arg; + return; + } bytes_left = for_each_line(st->pcd->buf, st->pcd->loaded, &check_stat_line); if (st->pcd->loaded != bytes_left) { @@ -1060,7 +1059,6 @@ static void init_status_task(struct status_task *st) memset(st, 0, sizeof(struct status_task)); st->task.pre_select = status_pre_select; st->task.post_select = status_post_select; - st->task.event_handler = status_event_handler; st->task.private_data = st; st->sa_time_diff_sign = 1; st->clock_diff_count = conf.clock_diff_count_arg; @@ -1094,6 +1092,7 @@ int main(int argc, char *argv[]) valid_fd_012(); audiod_cmdline_parser(argc, argv, &conf); + HANDLE_VERSION_FLAG("audiod", conf); para_drop_privileges(conf.user_arg, conf.group_arg); cf = configfile_exists(); if (cf) {