extern const char *status_item_list[NUM_STAT_ITEMS];
extern struct misc_meta_data *mmd;
-extern struct audio_file_selector selectors[];
extern struct sender senders[];
static void dummy(__a_unused int s)
ret = make_message(
"%s:%zu\n" "%s:%s\n" "%s:%lu\n" "%s:%u\n"
"%s:%s\n" "%s:%s\n" "%s:%s\n" "%s:%s\n"
- "%s:%li\n" "%s:%s\n" "%s" "%s"
+ "%s:%li\n" "%s:%s\n" "%s"
"%s:%s\n" "%s:%lu.%lu\n" "%s:%lu.%lu\n",
status_item_list[SI_FILE_SIZE], nmmd->size / 1024,
status_item_list[SI_MTIME], mtime,
status_item_list[SI_STATUS_BAR], bar ? bar : "(none)",
status_item_list[SI_STATUS], status,
status_item_list[SI_STATUS_FLAGS], flags,
- status_item_list[SI_SELECTOR], selectors[nmmd->selector_num].name,
+ status_item_list[SI_SELECTOR], "FIXME",
status_item_list[SI_OFFSET], offset,
status_item_list[SI_FORMAT], audio_format_name(nmmd->audio_format),
- nmmd->selector_info,
nmmd->afi.info_string,
status_item_list[SI_UPTIME], ut,
{
int i, ret;
char *ut;
- char *selector_string = NULL, *sender_info = NULL, *sender_list = NULL;
+ char *sender_info = NULL, *sender_list = NULL;
if (argc != 1)
return -E_COMMAND_SYNTAX;
mmd_lock();
- for (i = 0; selectors[i].name; i++) {
- selector_string = para_strcat(selector_string, selectors[i].name);
- selector_string = para_strcat(selector_string, " ");
- }
for (i = 0; senders[i].name; i++) {
char *info = senders[i].info();
sender_info = para_strcat(sender_info, info);
"pid: %d\n"
"connections (active/accepted/total): %u/%u/%u\n"
"current loglevel: %i\n"
- "supported audio file selectors: %s\n"
"supported audio formats: %s\n"
"supported senders: %s\n"
"%s",
mmd->num_commands,
mmd->num_connects,
conf.loglevel_arg,
- selector_string,
supported_audio_formats(),
sender_list,
sender_info
);
mmd_unlock();
free(ut);
- free(selector_string);
free(sender_list);
free(sender_info);
return ret;
*handler = para_strdup("para_server"); /* server commands */
return cmd;
}
- /* not found, look for commands supported by the current selector */
- mmd_lock();
- if (handler)
- *handler = make_message("the %s selector",
- selectors[mmd->selector_num].name);
- cmd = selectors[mmd->selector_num].cmd_list;
- mmd_unlock();
- for (; cmd->name; cmd++)
- if (!strcmp(cmd->name, name))
- return cmd;
/* not found, look for commands supported by afs */
for (cmd = afs_cmds; cmd->name; cmd++)
if (!strcmp(cmd->name, name))
/* no argument given, print list of commands */
if ((ret = send_list_of_commands(fd, server_cmds, "server")) < 0)
return ret;
- mmd_lock();
- handler = para_strdup(selectors[mmd->selector_num].name);
- cmd = selectors[mmd->selector_num].cmd_list;
- mmd_unlock();
- ret = send_list_of_commands(fd, cmd, handler);
- free(handler);
- if (ret < 0)
- return ret;
- cmd = afs_cmds;
- return send_list_of_commands(fd, cmd, "afs");
+ return send_list_of_commands(fd, afs_cmds, "afs");
}
/* argument given for help */
cmd = get_cmd_ptr(argv[1], &handler);
return 1;
}
-int com_chs(int fd, int argc, char * const * argv)
-{
- int i, ret;
-
- if (argc == 1) {
- char *selector;
- mmd_lock();
- selector = para_strdup(selectors[mmd->selector_num].name);
- mmd_unlock();
- ret = send_va_buffer(fd, "%s\n", selector);
- free(selector);
- return ret;
- }
- for (i = 0; selectors[i].name; i++) {
- if (strcmp(selectors[i].name, argv[1]))
- continue;
- mmd_lock();
- mmd->selector_change = i;
- mmd->events++;
- mmd_unlock();
- return 1;
- }
- return -E_BAD_SELECTOR;
-}
-
/* next */
int com_next(__a_unused int fd, int argc, __a_unused char * const * argv)
{
* encrypted with its RSA public key. From this point on,
* all transfers are crypted with this session key.
*
- * Next it is checked if the peer supplied a valid server
- * command or a command for the audio file selector currently
- * in use. If yes, and if the user has sufficient
- * permissions to execute that command, the function calls
- * the corresponding command handler which does argument
- * checking and further processing.
+ * Next it is checked if the peer supplied a valid server command or a command
+ * for the audio file selector. If yes, and if the user has sufficient
+ * permissions to execute that command, the function calls the corresponding
+ * command handler which does argument checking and further processing.
*
* In order to cope with a DOS attacks, a timeout is set up
* which terminates the function if the connection was not
extern void http_send_init(struct sender *);
extern void ortp_send_init(struct sender *);
-/* TODO: This is better handled by autoconf */
-/** the list of supported audio file selectors */
-struct audio_file_selector selectors[] = {
- {
- .name = "random",
- .init = random_selector_init,
- .update_audio_file = NULL,
- },
- {
- .name = "playlist",
- .init = playlist_selector_init,
- .update_audio_file = NULL,
- .pre_select = NULL,
- .post_select = NULL,
- },
-#ifdef HAVE_MYSQL
- {
- .name = "mysql",
- .init = mysql_selector_init,
- .update_audio_file = NULL,
- .pre_select = NULL,
- .post_select = NULL,
- },
-#endif
- {
- .name = NULL,
- }
-};
-
/** the list of supported senders */
struct sender senders[] = {
{
}
}
-static void init_selector(void)
-{
- int i, ret;
-
- mmd->selector_change = -1; /* no change nec., set to new num by com_chs */
- if (!conf.selector_given)
- goto random;
- for (i = 0; selectors[i].name; i++) {
- if (strcmp(selectors[i].name, conf.selector_arg))
- continue;
- PARA_NOTICE_LOG("initializing %s audio file selector\n",
- selectors[i].name);
- ret = selectors[i].init(&selectors[i]);
- if (ret < 0) {
- PARA_WARNING_LOG("%s", PARA_STRERROR(-ret));
- break;
- }
- mmd->selector_num = i;
- return;
- }
- PARA_WARNING_LOG("%s", "falling back to the random selector\n");
-random:
- mmd->selector_num = 0;
- selectors[0].init(&selectors[0]); /* always successful */
-}
-
static unsigned init_network(void)
{
int fd, ret = init_tcp_socket(conf.port_arg);
/* become daemon */
if (conf.daemon_given)
daemon_init();
- init_selector();
+// init_selector();
// PARA_ERROR_LOG("num: %d\n", mmd->selector_num);
PARA_NOTICE_LOG("%s", "initializing virtual streaming system\n");
afh_init();
return sockfd;
}
-static void change_selector(void)
-{
- int ret, old = mmd->selector_num, new = mmd->selector_change;
-
- selectors[old].shutdown();
- ret = selectors[new].init(&selectors[new]);
- mmd->selector_change = -1; /* reset */
- if (ret >= 0) {
- mmd->selector_num = new;
- return;
- }
- /* init failed */
- PARA_ERROR_LOG("%s -- switching to the random selector\n", PARA_STRERROR(-ret));
- selectors[0].init(&selectors[0]);
- mmd->selector_num = 0;
-}
-
/*
* called when server gets SIGHUP or when client invokes hup command.
*/
close_log(logfile); /* gets reopened if necessary by parse_config */
logfile = NULL;
parse_config(1); /* reopens log */
- mmd->selector_change = mmd->selector_num; /* do not change selector.. */
- change_selector(); /* .. just reload */
init_user_list(user_list_file); /* reload user list */
if (afs_pid)
kill(afs_pid, SIGHUP);
continue;
senders[i].pre_select(&max_fileno, &rfds, &wfds);
}
- if (selectors[mmd->selector_num].pre_select) {
- ret = selectors[mmd->selector_num].pre_select(&rfds, &wfds);
- max_fileno = PARA_MAX(max_fileno, ret);
- }
mmd_unlock();
ret = para_select(max_fileno + 1, &rfds, &wfds, timeout);
mmd_lock();
vss_post_select(&rfds, &wfds);
- if (mmd->selector_change >= 0)
- change_selector();
- if (selectors[mmd->selector_num].post_select)
- selectors[mmd->selector_num].post_select(&rfds, &wfds);
if (ret < 0)
goto repeat;
for (i = 0; senders[i].name; i++) {
PARA_EMERG_LOG("terminating on signal %d\n", sig);
genocide:
kill(0, SIGTERM);
- selectors[mmd->selector_num].shutdown();
mutex_destroy(mmd_mutex);
shm_detach(mmd);
shm_destroy(mmd_shm_id);