#include "audiod.cmdline.h"
#include "list.h"
#include "sched.h"
+#include "ggo.h"
#include "recv.h"
#include "filter.h"
#include "grab_client.cmdline.h"
* \param ll loglevel
* \param fmt the format string
*/
-void para_log(int ll, const char* fmt,...)
+__printf_2_3 void para_log(int ll, const char* fmt,...)
{
va_list argp;
FILE *outfd;
va_end(argp);
}
-static char *configfile_exists(void)
+static void parse_config_or_die(void)
{
- char *home = para_homedir();
- char *config_file = make_message("%s/.paraslash/audiod.conf",
- home);
- free(home);
- if (file_exists(config_file))
- return config_file;
+ char *config_file;
+
+ if (conf.config_file_given)
+ config_file = para_strdup(conf.config_file_arg);
+ else {
+ char *home = para_homedir();
+ config_file = make_message("%s/.paraslash/audiod.conf", home);
+ free(home);
+ }
+ if (conf.config_file_given && !file_exists(config_file)) {
+ PARA_EMERG_LOG("can not read config file %s\n", config_file);
+ goto err;
+ }
+ if (config_file) {
+ struct audiod_cmdline_parser_params params = {
+ .override = 0,
+ .initialize = 0,
+ .check_required = 1,
+ .check_ambiguity = 0,
+ .print_errors = 1
+ };
+ if (audiod_cmdline_parser_config_file(config_file, &conf, ¶ms)) {
+ PARA_EMERG_LOG("parse error in config file\n");
+ goto err;
+ }
+ }
free(config_file);
- return NULL;
+ return;
+err:
+ free(config_file);
+ exit(EXIT_FAILURE);
}
static void setup_signal_handling(void)
struct audio_format_info *a;
init_supported_writers();
- nw = PARA_MAX(1, conf.writer_given);
+ nw = PARA_MAX(1U, conf.writer_given);
PARA_INFO_LOG("maximal number of writers: %d\n", nw);
FOR_EACH_AUDIO_FORMAT(i) {
a = &afi[i];
int i, ret, nf;
filter_init(filters);
- nf = PARA_MAX(1, conf.filter_given);
+ nf = PARA_MAX(1U, conf.filter_given);
PARA_INFO_LOG("maximal number of filters: %d\n", nf);
FOR_EACH_AUDIO_FORMAT(i) {
afi[i].filter_conf = para_malloc(nf * sizeof(void *));
stat_task->offset_seconds = 0;
audiod_status_dump();
stat_task->playing = 0;
- stat_item_values[SI_BASENAME] = make_message(
- "%s: no connection to para_server\n",
- status_item_list[SI_BASENAME]);
- stat_client_write(stat_item_values[SI_BASENAME],
- SI_BASENAME);
}
/**
client_open(argc, argv, &st->ct);
set_stat_task_restart_barrier(5);
}
+ free(stat_item_values[SI_BASENAME]);
+ stat_item_values[SI_BASENAME] = make_message(
+ "%s: no connection to para_server\n",
+ status_item_list[SI_BASENAME]);
+ stat_client_write(stat_item_values[SI_BASENAME],
+ SI_BASENAME);
st->last_status_read = *now;
out:
start_stop_decoders(s);
PARA_WARNING_LOG("invalid mode\n");
}
+__noreturn static void print_help_and_die(void)
+{
+ int d = conf.detailed_help_given;
+ const char **p = d? audiod_args_info_detailed_help
+ : audiod_args_info_help;
+
+ printf_or_die("%s\n\n", AUDIOD_CMDLINE_PARSER_PACKAGE "-"
+ AUDIOD_CMDLINE_PARSER_VERSION);
+ printf_or_die("%s\n\n", audiod_args_info_usage);
+ for (; *p; p++)
+ printf_or_die("%s\n", *p);
+ print_receiver_helps(d);
+ print_filter_helps(d);
+ print_writer_helps(d);
+ exit(0);
+}
+
+
/**
* the main function of para_audiod
*
* */
int main(int argc, char *argv[])
{
- char *config_file;
int ret, i;
static struct sched s;
struct command_task command_task_struct, *cmd_task = &command_task_struct;
audiod_cmdline_parser_ext(argc, argv, &conf, ¶ms);
HANDLE_VERSION_FLAG("audiod", conf);
para_drop_privileges(conf.user_arg, conf.group_arg);
- config_file = configfile_exists();
- if (config_file) {
- params.override = 0;
- params.initialize = 0;
- params.check_required = 1;
- params.check_ambiguity = 0;
- params.print_errors = 1;
- if (audiod_cmdline_parser_config_file(config_file, &conf, ¶ms)) {
- PARA_EMERG_LOG("parse error in config file\n");
- exit(EXIT_FAILURE);
- }
- free(config_file);
- }
+ parse_config_or_die();
if (conf.logfile_given)
logfile = open_log(conf.logfile_arg);
- log_welcome("para_audiod", conf.loglevel_arg);
i = init_stream_io();
+ if (conf.help_given || conf.detailed_help_given)
+ print_help_and_die();
if (i < 0) {
PARA_EMERG_LOG("init stream io error: %s\n", para_strerror(-i));
exit(EXIT_FAILURE);
}
+ log_welcome("para_audiod", conf.loglevel_arg);
server_uptime(UPTIME_SET);
set_initial_status();
FOR_EACH_SLOT(i)