X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=audiod.c;h=2dba01c6fa938dec24264d69480ddb5b0e23f61a;hb=da1a145bf2f9d1a57c3359372695894247fef704;hp=2798ad26d57387c65779d9435b5ac471b901a54d;hpb=1b46ae4193cddb7d589b0f2f7d8158b84f7e9f6d;p=paraslash.git diff --git a/audiod.c b/audiod.c index 2798ad26..2dba01c6 100644 --- a/audiod.c +++ b/audiod.c @@ -243,43 +243,6 @@ static int get_empty_slot(void) return -E_NO_MORE_SLOTS; } -static void close_stat_pipe(void) -{ - int i; - - if (!stat_task->pcd) - return; - client_close(stat_task->pcd); - stat_task->pcd = NULL; - for (i = 0; i < NUM_STAT_ITEMS; i++) { - free(stat_task->stat_item_values[i]); - stat_task->stat_item_values[i] = NULL; - } - dump_empty_status(); - stat_task->length_seconds = 0; - stat_task->offset_seconds = 0; - audiod_status_dump(); - stat_task->playing = 0; - stat_task->stat_item_values[SI_STATUS_BAR] = make_message( - "%s:no connection to para_server\n", - status_item_list[SI_STATUS_BAR]); - stat_client_write(stat_task->stat_item_values[SI_STATUS_BAR], - SI_STATUS_BAR); - if (stat_task->clock_diff_count) { - stat_task->clock_diff_barrier.tv_sec = now->tv_sec + 1; - stat_task->clock_diff_barrier.tv_usec = now->tv_usec; - } -} - -void __noreturn clean_exit(int status, const char *msg) -{ - PARA_EMERG_LOG("%s\n", msg); - if (socket_name) - unlink(socket_name); - close_stat_pipe(); - exit(status); -} - /** * get the number of filters * @@ -578,18 +541,6 @@ static void check_stat_line(char *line) } } -static void handle_signal(int sig) -{ - switch (sig) { - case SIGINT: - case SIGTERM: - case SIGHUP: - PARA_EMERG_LOG("terminating on signal %d\n", sig); - clean_exit(EXIT_FAILURE, "caught deadly signal"); - return; - } -} - static void try_to_close_slot(int slot_num) { struct slot_info *s = &slot[slot_num]; @@ -915,10 +866,13 @@ static void signal_event_handler(struct task *t) { struct signal_task *st = t->private_data; - if (t->ret != -E_SIGNAL_CAUGHT) - PARA_ERROR_LOG("%s (ignored)\n", PARA_STRERROR(-t->ret)); - else - handle_signal(st->signum); + switch (st->signum) { + case SIGINT: + case SIGTERM: + case SIGHUP: + PARA_EMERG_LOG("terminating on signal %d\n", st->signum); + clean_exit(EXIT_FAILURE, "caught deadly signal"); + } } static void signal_pre_select(struct sched *s, struct task *t) @@ -978,36 +932,68 @@ static void init_command_task(struct command_task *ct) sprintf(ct->task.status, "command task"); } -static void client_task_event_handler(__a_unused struct task *t) +static void close_stat_pipe(void) { - struct private_client_data *pcd = t->private_data; - if (t->ret == -E_HANDSHAKE_COMPLETE) + int i; + + if (!stat_task->pcd) return; - unregister_task(t); - pcd->eof = 1; + client_close(stat_task->pcd); + stat_task->pcd = NULL; + for (i = 0; i < NUM_STAT_ITEMS; i++) { + free(stat_task->stat_item_values[i]); + stat_task->stat_item_values[i] = NULL; + } + dump_empty_status(); + stat_task->length_seconds = 0; + stat_task->offset_seconds = 0; + audiod_status_dump(); + stat_task->playing = 0; + stat_task->stat_item_values[SI_STATUS_BAR] = make_message( + "%s:no connection to para_server\n", + status_item_list[SI_STATUS_BAR]); + stat_client_write(stat_task->stat_item_values[SI_STATUS_BAR], + SI_STATUS_BAR); + if (stat_task->clock_diff_count) { + stat_task->clock_diff_barrier.tv_sec = now->tv_sec + 1; + stat_task->clock_diff_barrier.tv_usec = now->tv_usec; + } } -static void status_event_handler(__a_unused struct task *t) +void __noreturn clean_exit(int status, const char *msg) { - struct timeval delay = {1, 0}; + PARA_EMERG_LOG("%s\n", msg); + if (socket_name) + unlink(socket_name); + close_stat_pipe(); + exit(status); +} + + +static void client_task_event_handler(__a_unused struct task *t) +{ + struct private_client_data *pcd = t->private_data; int i; - struct status_task *st = t->private_data; + struct timeval delay = {1, 0}; - PARA_ERROR_LOG("%s\n", PARA_STRERROR(-t->ret)); + if (t->ret == -E_HANDSHAKE_COMPLETE) + return; + unregister_task(t); 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) @@ -1019,15 +1005,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_open(argc, argv, &st->pcd); + ret = client_open(argc, argv, &st->pcd); } else { char *argv[] = {"audiod", "stat", NULL}; int argc = 2; - t->ret = client_open(argc, argv, &st->pcd); + ret = client_open(argc, argv, &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 +1027,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 +1051,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 +1084,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) {