NEWS
====
+-----------------------------------------------
+0.5.4 (to be announced) "exponential alignment"
+-----------------------------------------------
+
+ - Minor cleanups to daemon.c.
+ - New URLs for home page and git services.
+ - Improved error diagnostics for the mvblob commands.
+ - New sender subcommand: status.
+ - Improved help text for server and afs commands.
++ - audiod memory leak fixes.
+
+Download: ./releases/paraslash-git.tar.bz2
+
---------------------------------------------
0.5.3 (2014-08-01) "symbolic synchronization"
---------------------------------------------
/*
- * Copyright (C) 2005-2014 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2014 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
para_fd_set(st->fd, &s->rfds, &s->max_fileno);
}
- static int signal_post_select(struct sched *s, __a_unused void *context)
+ static int signal_post_select(struct sched *s, void *context)
{
- int signum;
+ struct signal_task *st = context;
+ int ret, signum;
+
+ ret = task_get_notification(st->task);
+ if (ret < 0)
+ return ret;
signum = para_next_signal(&s->rfds);
switch (signum) {
case SIGINT:
case SIGTERM:
case SIGHUP:
PARA_NOTICE_LOG("received signal %d\n", signum);
- clean_exit(EXIT_FAILURE, "caught deadly signal");
+ task_notify_all(s, E_AUDIOD_SIGNAL);
+ return -E_AUDIOD_SIGNAL;
}
return 0;
}
struct timeval tmp, delay;
bool force = true;
- ret = handle_connect(ct->fd, &s->rfds);
+ ret = task_get_notification(ct->task);
if (ret < 0)
+ return ret;
+ ret = handle_connect(ct->fd, &s->rfds);
+ if (ret < 0) {
PARA_ERROR_LOG("%s\n", para_strerror(-ret));
- else if (ret > 0)
+ if (ret == -E_AUDIOD_TERM) {
+ task_notify_all(s, -ret);
+ return ret;
+ }
+ } else if (ret > 0)
goto dump;
/* if last status dump was less than 500ms ago, do nothing */
close_slot(i);
}
- /**
- * Close the connection to para_server and exit.
- *
- * \param status The exit status which is passed to exit(3).
- * \param msg The log message
- *
- * Log \a msg with loglevel \p EMERG, close the connection to para_server and
- * all slots, and call \p exit(status). \a status should be either EXIT_SUCCESS
- * or EXIT_FAILURE.
+ /*
+ * Cleanup all resources.
*
- * \sa exit(3).
+ * This performs various cleanups, removes the audiod socket and closes the
+ * connection to para_server.
*/
- void __noreturn clean_exit(int status, const char *msg)
+ static void audiod_cleanup(void)
{
if (socket_name)
unlink(socket_name);
close_unused_slots();
audiod_cmdline_parser_free(&conf);
close_stat_clients();
- PARA_EMERG_LOG("%s\n", msg);
- exit(status);
}
/*
static int status_post_select(struct sched *s, void *context)
{
struct status_task *st = context;
+ int ret;
+ ret = task_get_notification(st->task);
+ if (ret < 0)
+ return ret;
if (audiod_status == AUDIOD_OFF) {
if (!st->ct)
goto out;
if (st->ct) {
char *buf;
size_t sz;
- int ret;
ret = btr_node_status(st->btrn, st->min_iqs, BTR_NT_LEAF);
if (ret < 0) {
writer_init();
if (conf.help_given || conf.detailed_help_given)
print_help_and_die();
- drop_privileges_or_die(conf.user_arg, conf.group_arg);
+ daemon_drop_privileges_or_die(conf.user_arg, conf.group_arg);
parse_config_or_die();
init_colors_or_die();
init_random_seed_or_die();
PARA_EMERG_LOG("%s\n", para_strerror(-ret));
exit(EXIT_FAILURE);
}
- log_welcome("para_audiod");
- set_server_start_time(NULL);
+ daemon_log_welcome("para_audiod");
+ daemon_set_start_time();
set_initial_status();
FOR_EACH_SLOT(i)
clear_slot(i);
sched.default_timeout.tv_sec = 2;
sched.default_timeout.tv_usec = 999 * 1000;
ret = schedule(&sched);
+ audiod_cleanup();
sched_shutdown(&sched);
- PARA_EMERG_LOG("%s\n", para_strerror(-ret));
- return EXIT_FAILURE;
+ if (ret < 0)
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+ return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;
}
/*
- * Copyright (C) 2005-2014 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2014 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
return grab_client_new(fd, argc, argv, &sched);
}
- __noreturn static int com_term(int fd, __a_unused int argc, __a_unused char **argv)
+ static int com_term(int fd, __a_unused int argc, __a_unused char **argv)
{
close(fd);
- clean_exit(EXIT_SUCCESS, "terminating on user request");
+ return -E_AUDIOD_TERM;
}
static int com_on(int fd, __a_unused int argc, __a_unused char **argv)
free(new);
}
- new = get_server_uptime_str(now);
+ new = daemon_get_uptime_str(now);
old = stat_item_values[SI_AUDIOD_UPTIME];
if (force || !old || strcmp(old, new)) {
free(old);
/*
- * Copyright (C) 2006-2014 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2014 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
PARA_ERROR(NOT_PLAYING, "not playing"), \
PARA_ERROR(AUDIOD_OFF, "audiod switched off"), \
PARA_ERROR(STATUS_TIMEOUT, "status item timeout"), \
+ PARA_ERROR(AUDIOD_SIGNAL, "caught deadly signal"), \
+ PARA_ERROR(AUDIOD_TERM, "terminating on user request"), \
#define AUDIOD_COMMAND_ERRORS \