#include "sched.h"
#include "signal.h"
#include "user_list.h"
+#include "color.h"
/** Define the array of error lists needed by para_server. */
INIT_SERVER_ERRLISTS;
/** The mutex protecting the shared memory area containing the mmd struct. */
int mmd_mutex;
-/* global variables for server-internal use */
-static FILE *logfile;
/** The file containing user information (public key, permissions). */
static char *user_list_file = NULL;
static int mmd_shm_id;
struct task task;
};
-/**
- * Para_server's log function.
- *
- * \param ll The log level.
- * \param fmt The format string describing the log message.
- */
-__printf_2_3 void para_log(int ll, const char* fmt,...)
+static int want_colors(void)
+{
+ if (conf.color_arg == color_arg_no)
+ return 0;
+ if (conf.color_arg == color_arg_yes)
+ return 1;
+ if (conf.logfile_given)
+ return 0;
+ return isatty(STDERR_FILENO);
+}
+
+static void init_colors_or_die(void)
{
- va_list argp;
- FILE *outfd;
- struct tm *tm;
- time_t t1;
- char str[MAXLINE] = "";
- pid_t mypid;
-
- if (ll < conf.loglevel_arg)
+ int ret, i;
+
+ if (!want_colors())
return;
- outfd = logfile? logfile : stderr;
- time(&t1);
- tm = localtime(&t1);
- strftime(str, MAXLINE, "%b %d %H:%M:%S", tm);
- fprintf(outfd, "%s ", str);
- if (conf.loglevel_arg <= INFO)
- fprintf(outfd, "%i: ", ll);
- mypid = getpid();
- if (conf.loglevel_arg <= INFO)
- fprintf(outfd, "(%d) ", (int)mypid);
- va_start(argp, fmt);
- vfprintf(outfd, fmt, argp);
- va_end(argp);
+ daemon_set_flag(DF_COLOR_LOG);
+ daemon_set_default_log_colors();
+ for (i = 0; i < conf.log_color_given; i++) {
+ ret = daemon_set_log_color(conf.log_color_arg[i]);
+ if (ret < 0)
+ exit(EXIT_FAILURE);
+ }
}
/*
exit(EXIT_FAILURE);
}
+/**
+ * (Re-)read the server configuration files.
+ *
+ * \param override Passed to gengetopt to activate the override feature.
+ *
+ * This function also re-opens the logfile and sets the global \a
+ * user_list_file variable.
+ */
void parse_config_or_die(int override)
{
char *home = para_homedir();
- struct stat statbuf;
int ret;
char *cf;
- close_log(logfile);
- logfile = NULL;
+ daemon_close_log();
if (conf.config_file_given)
cf = para_strdup(conf.config_file_arg);
else
user_list_file = make_message("%s/.paraslash/server.users", home);
else
user_list_file = para_strdup(conf.user_list_arg);
- ret = stat(cf, &statbuf);
- if (ret && conf.config_file_given) {
+ ret = file_exists(cf);
+ if (conf.config_file_given && !ret) {
ret = -1;
- PARA_EMERG_LOG("can not stat config file %s\n", cf);
+ PARA_EMERG_LOG("can not read config file %s\n", cf);
goto out;
}
- if (!ret) {
+ if (ret) {
int tmp = conf.daemon_given;
struct server_cmdline_parser_params params = {
.override = override,
.initialize = 0,
.check_required = 1,
.check_ambiguity = 0,
- .print_errors = 1
+ .print_errors = !conf.daemon_given
};
server_cmdline_parser_config_file(cf, &conf, ¶ms);
conf.daemon_given = tmp;
}
- if (conf.logfile_given)
- logfile = open_log(conf.logfile_arg);
+ if (conf.logfile_given) {
+ daemon_set_logfile(conf.logfile_arg);
+ daemon_open_log_or_die();
+ }
+ daemon_set_loglevel(conf.loglevel_arg);
+ init_colors_or_die();
+ daemon_set_flag(DF_LOG_PID);
+ daemon_set_flag(DF_LOG_LL);
+ daemon_set_flag(DF_LOG_TIME);
ret = 1;
out:
free(cf);
drop_privileges_or_die(conf.user_arg, conf.group_arg);
/* parse config file, open log and set defaults */
parse_config_or_die(0);
- log_welcome("para_server", conf.loglevel_arg);
+ log_welcome("para_server");
init_ipc_or_die(); /* init mmd struct and mmd->lock */
/* make sure, the global now pointer is uptodate */
gettimeofday(now, NULL);
init_user_list(user_list_file);
/* become daemon */
if (conf.daemon_given)
- daemon_init();
+ daemonize();
PARA_NOTICE_LOG("initializing audio format handlers\n");
afh_init();
PARA_NOTICE_LOG("initializing the audio file selector\n");