* Licensed under the GPL v2. For licencing details see COPYING.
*/
-/** \file server.c Paraslash's main server */
+/** \file server.c Paraslash's main server. */
-/** \mainpage Paraslash API Reference
+/**
+ * \mainpage Paraslash API Reference
+ *
+ * Starting points for getting an overview are
+ *
+ * probably:
+ *
+ * - The main programs: \ref server.c, \ref audiod.c, \ref client.c,
+ * \ref audioc.c, \ref fsck.c,
+ * - Server: \ref server_command, \ref sender,
+ * - Audio file selector: \ref audio_format_handler, \ref mood, \ref afs_table,
+ * - Client: \ref receiver, \ref receiver_node, \ref filter, \ref filter_node.
+ *
+ *
+ * The gory details, listed by topic:
*
- * Good starting points for reading are probably \ref audio_file_selector,
- * \ref sender, \ref receiver, \ref receiver_node, \ref filter, \ref
- * filter_node.
+ * - Audio format handlers: \ref mp3_afh.c, \ref ogg_afh.c, \ref aac_afh.c,
+ * - Decoders: \ref mp3dec.c, \ref oggdec.c, \ref aacdec.c,
+ * - Volume normalizer: \ref compress.c,
+ * - Output: \ref alsa_write.c, \ref osx_write.c,
+ * - http: \ref http_recv.c, \ref http_send.c,
+ * - ortp: \ref ortp_recv.c, \ref ortp_send.c,
+ * - dccp: \ref dccp_recv.c, \ref dccp_send.c,
+ * - Audio file selector: \ref afs.c, \ref aft.c, \ref mood.c,
+ * - Afs structures: \ref afs_table, \ref audio_file_data,
+ * \ref afs_info \ref afh_info,
+ * - Afs tables: \ref aft.c, \ref mood.c, \ref playlist.c,
+ * \ref attribute.c, \ref score.c,
+ * - The virtual streaming system: \ref vss.c, \ref chunk_queue.c.
+ *
+ * Lower levels:
+ *
+ * - Scheduling: \ref sched.c, \ref sched.h,
+ * - Networking: \ref net.c,
+ * - File descriptors: \ref fd.c,
+ * - Signals: \ref signal.c,
+ * - Daemons: \ref daemon.c,
+ * - Strings: \ref string.c, \ref string.h,
+ * - Time: \ref time.c,
+ * - Spawning processes: \ref exec.c,
+ * - Inter process communication: \ref ipc.c,
+ * - The object storage layer: \ref osl.c,
+ * - Blob tables: \ref blob.c,
+ * - The error subssystem: \ref error.h.
+ *
+ * Low-level data structures:
+ *
+ * - Doubly linked lists: \ref list.h,
+ * - Red-black trees: \ref rbtree.h, \ref rbtree.c,
+ * - Ring buffer: \ref ringbuffer.c, \ref ringbuffer.h,
+ * - Hashing: \ref hash.h, \ref sha1.h, \ref sha1.c,
+ * - Crypto: \ref crypt.c.
*
*/
#include "para.h"
#include "error.h"
#include "server.cmdline.h"
-#include "afs_common.h"
#include "afh.h"
#include "string.h"
#include "afs.h"
#define ALARM_TIMEOUT 10
/**
- * pointer to shared memory area for communication between para_server
- * and its children. exported to vss.c. command.c and to all selectors.
+ * Pointer to shared memory area for communication between para_server
+ * and its children. Exported to vss.c. command.c and to afs.
*/
struct misc_meta_data *mmd;
/**
* the configuration of para_server
*
- * It also contains the options for all audio file selectors, audio format handler
- * and all supported senders.
+ * It also contains the options for the audio file selector, audio format
+ * handler and all supported senders.
*/
struct server_args_info conf;
goto err_out;
mmd_mutex = ret;
- mmd->selector_num = 0;
mmd->num_played = 0;
mmd->num_commands = 0;
mmd->events = 0;
mmd->num_connects = 0;
mmd->active_connections = 0;
- strcpy(mmd->filename, "(none)");
- mmd->audio_format = -1;
mmd->vss_status_flags = VSS_NEXT;
mmd->new_vss_status_flags = VSS_NEXT;
mmd->sender_cmd_data.cmd_num = -1;
/**
* lock the shared memory area containing the mmd struct
*
- * \sa semop(2), struct misc_meta_data
+ * \sa semop(2), struct misc_meta_data.
*/
void mmd_lock(void)
{
char *cf;
if (conf.config_file_given)
- cf = conf.config_file_arg;
+ cf = para_strdup(conf.config_file_arg);
else
cf = make_message("%s/.paraslash/server.conf", home);
free(user_list_file);
int ret = 0;
signal_pipe = para_signal_init();
- PARA_NOTICE_LOG("%s", "setting up signal handlers\n");
+
+ PARA_NOTICE_LOG("setting up signal handlers\n");
ret += para_install_sighandler(SIGINT);
ret += para_install_sighandler(SIGTERM);
ret += para_install_sighandler(SIGHUP);
PARA_EMERG_LOG("%s", "could not install signal handlers\n");
exit(EXIT_FAILURE);
}
+ add_close_on_fork_list(signal_pipe);
}
static unsigned init_network(void)
ret = mark_fd_nonblock(fd);
if (ret < 0)
goto err;
+ add_close_on_fork_list(fd); /* child doesn't need the listener */
return fd;
err:
PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
}
-static unsigned do_inits(int argc, char **argv)
+static unsigned server_init(int argc, char **argv)
{
/* connector's address information */
int sockfd;
/* become daemon */
if (conf.daemon_given)
daemon_init();
-// init_selector();
-// PARA_ERROR_LOG("num: %d\n", mmd->selector_num);
- PARA_NOTICE_LOG("%s", "initializing virtual streaming system\n");
+ PARA_NOTICE_LOG("initializing audio format handlers\n");
afh_init();
+ PARA_NOTICE_LOG("initializing virtual streaming system\n");
vss_init();
mmd->server_pid = getpid();
setup_signal_handling();
+ PARA_NOTICE_LOG("initializing the audio file selector\n");
init_afs();
mmd_lock();
/* init network socket */
- PARA_NOTICE_LOG("%s", "initializing tcp command socket\n");
+ PARA_NOTICE_LOG("initializing tcp command socket\n");
sockfd = init_network();
- PARA_NOTICE_LOG("%s", "init complete\n");
+ PARA_NOTICE_LOG("server init complete\n");
return sockfd;
}
prev_events = mmd->events;
mmd->vss_status_flags = mmd->new_vss_status_flags;
if (ret) {
- PARA_DEBUG_LOG("%d events, forcing status update, af = %d\n",
- mmd->events, mmd->audio_format);
+ PARA_DEBUG_LOG("%d events, forcing status update\n",
+ mmd->events);
killpg(0, SIGUSR1);
}
}
struct timeval *timeout;
valid_fd_012();
- sockfd = do_inits(argc, argv);
+ sockfd = server_init(argc, argv);
repeat:
FD_ZERO(&rfds);
FD_ZERO(&wfds);
}
alarm(ALARM_TIMEOUT);
close_listed_fds();
- close(sockfd); /* child doesn't need the listener */
+ para_signal_shutdown();
/*
* put info on who we are serving into argv[0] to make
* client ip visible in top/ps