/*
- * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
* - The main programs: \ref server.c, \ref audiod.c, \ref client.c,
* \ref audioc.c, \ref afh.c
* - Server: \ref server_command, \ref sender,
- * - Audio file selector: \ref audio_format_handler, \ref mood, \ref afs_table,
+ * - Audio file selector: \ref audio_format_handler, \ref afs_table,
* - Client: \ref receiver, \ref receiver_node, \ref filter, \ref filter_node.
*
*
* The gory details, listed by topic:
*
- * - Audio format handlers: \ref send_common.c \ref mp3_afh.c, \ref ogg_afh.c, \ref aac_afh.c,
- * - Decoders: \ref mp3dec_filter.c, \ref oggdec_filter.c, \ref aacdec_filter.c,
+ * - Audio format handlers: \ref send_common.c \ref mp3_afh.c,
+ * \ref ogg_afh.c, \ref aac_afh.c, \ref wma_afh.c,
+ * - Decoders: \ref mp3dec_filter.c, \ref oggdec_filter.c,
+ * \ref aacdec_filter.c, \ref wmadec_filter.c,
* - Volume normalizer: \ref compress_filter.c,
- * - Output: \ref alsa_write.c, \ref osx_write.c,
+ * - Output: \ref alsa_write.c, \ref osx_write.c, \ref oss_write.c,
* - http: \ref http_recv.c, \ref http_send.c,
* - udp: \ref udp_recv.c, \ref udp_send.c,
* - dccp: \ref dccp_recv.c, \ref dccp_send.c,
* - Ring buffer: \ref ringbuffer.c, \ref ringbuffer.h,
* - Hashing: \ref hash.h, \ref sha1.h, \ref sha1.c,
* - Crypto: \ref crypt.c.
- * - Forward error correction: \ref fec.c
+ * - Forward error correction: \ref fec.c.
*/
#include <signal.h>
#include "string.h"
#include "afs.h"
#include "server.h"
+#include "list.h"
+#include "send.h"
#include "vss.h"
#include "config.h"
#include "close_on_fork.h"
-#include "list.h"
-#include "send.h"
#include "net.h"
#include "daemon.h"
#include "ipc.h"
daemon_set_flag(DF_LOG_PID);
daemon_set_flag(DF_LOG_LL);
daemon_set_flag(DF_LOG_TIME);
+ if (conf.log_timing_given)
+ daemon_set_flag(DF_LOG_TIMING);
ret = 1;
out:
free(cf);
kill(mmd->afs_pid, SIGHUP);
}
-static void signal_post_select(struct sched *s, struct task *t)
+static void signal_post_select(struct sched *s, __a_unused struct task *t)
{
- struct signal_task *st = container_of(t, struct signal_task, task);
+ int signum = para_next_signal(&s->rfds);
- if (!FD_ISSET(st->fd, &s->rfds))
+ switch (signum) {
+ case 0:
return;
-
- st->signum = para_next_signal();
- switch (st->signum) {
case SIGHUP:
handle_sighup();
break;
/* die on sigint/sigterm. Kill all children too. */
case SIGINT:
case SIGTERM:
- PARA_EMERG_LOG("terminating on signal %d\n", st->signum);
+ PARA_EMERG_LOG("terminating on signal %d\n", signum);
kill(0, SIGTERM);
/*
* We must wait for afs because afs catches SIGINT/SIGTERM.
pid_t child_pid;
uint32_t *chunk_table;
- if (!FD_ISSET(sct->listen_fd, &s->rfds))
- return;
- ret = para_accept(sct->listen_fd, NULL, 0);
- if (ret < 0)
+ ret = para_accept(sct->listen_fd, &s->rfds, NULL, 0, &new_fd);
+ if (ret <= 0)
goto out;
- new_fd = ret;
peer_name = remote_name(new_fd);
PARA_INFO_LOG("got connection from %s, forking\n", peer_name);
mmd->num_connects++;
sct->task.post_select = command_post_select;
sct->argc = argc;
sct->argv = argv;
- ret = para_listen(AF_UNSPEC, IPPROTO_TCP, conf.port_arg);
+ ret = para_listen_simple(IPPROTO_TCP, conf.port_arg);
if (ret < 0)
goto err;
sct->listen_fd = ret;