mirror of
https://github.com/SuperBFG7/ympd
synced 2025-07-07 12:22:50 +00:00
Feat: support environment variables
Feat: set default config file to /etc/mymmpd/mympd.conf Feat: use defaults, if config file doesn't exists
This commit is contained in:
parent
9053f7f419
commit
dbfdef524d
79
src/main.c
79
src/main.c
@ -44,18 +44,18 @@
|
|||||||
#include "../dist/src/inih/ini.h"
|
#include "../dist/src/inih/ini.h"
|
||||||
|
|
||||||
|
|
||||||
static void signal_handler(int sig_num) {
|
static void mympd_signal_handler(int sig_num) {
|
||||||
signal(sig_num, signal_handler); // Reinstantiate signal handler
|
signal(sig_num, mympd_signal_handler); // Reinstantiate signal handler
|
||||||
s_signal_received = sig_num;
|
s_signal_received = sig_num;
|
||||||
//Wakeup mympd_api_loop
|
//Wakeup mympd_api_loop
|
||||||
pthread_cond_signal(&mympd_api_queue->wakeup);
|
pthread_cond_signal(&mympd_api_queue->wakeup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int inihandler(void *user, const char *section, const char *name, const char* value) {
|
static int mympd_inihandler(void *user, const char *section, const char *name, const char* value) {
|
||||||
t_config* p_config = (t_config*)user;
|
t_config* p_config = (t_config*)user;
|
||||||
char *crap;
|
char *crap;
|
||||||
|
|
||||||
#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0
|
#define MATCH(s, n) strcasecmp(section, s) == 0 && strcasecmp(name, n) == 0
|
||||||
|
|
||||||
if (MATCH("mpd", "mpdhost")) {
|
if (MATCH("mpd", "mpdhost")) {
|
||||||
free(p_config->mpdhost);
|
free(p_config->mpdhost);
|
||||||
@ -164,7 +164,7 @@ static int inihandler(void *user, const char *section, const char *name, const c
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_config(t_config *config) {
|
static void mympd_free_config(t_config *config) {
|
||||||
free(config->mpdhost);
|
free(config->mpdhost);
|
||||||
free(config->mpdpass);
|
free(config->mpdpass);
|
||||||
free(config->webport);
|
free(config->webport);
|
||||||
@ -183,6 +183,35 @@ static void free_config(t_config *config) {
|
|||||||
free(config);
|
free(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mympd_parse_env(struct t_config *config, const char *envvar) {
|
||||||
|
char *name, *section;
|
||||||
|
const char *value = getenv(envvar);
|
||||||
|
if (value != NULL) {
|
||||||
|
char *var = strdup(envvar);
|
||||||
|
section = strtok_r(var, "_", &name);
|
||||||
|
if (section != NULL && name != NULL) {
|
||||||
|
LOG_DEBUG() printf("DEBUG: Using environment variable %s_%s: %s\n", section, name, value);
|
||||||
|
mympd_inihandler(config, section, name, value);
|
||||||
|
}
|
||||||
|
value = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mympd_get_env(struct t_config *config) {
|
||||||
|
const char* env_vars[]={"MPD_MPDHOST", "MPD_MPDPORT", "MPD_STREAMPORT",
|
||||||
|
"WEBSERVER_WEBPORT", "WEBSERVER_SSL", "WEBSERVER_SSLPORT", "WEBSERVER_SSLCERT", "WEBSERVER_SSLKEY",
|
||||||
|
"MYMPD_LOGLEVEL", "MYMPD_USER", "MYMPD_LOCALPLAYER", "MYMPD_COVERIMAGE", "MYMPD_COVERIMAGENAME",
|
||||||
|
"MYMPD_COVERIMAGESIZE", "MYMPD_VARLIBDIR", "MYMPD_MIXRAMP", "MYMPD_STICKERS", "MYMPD_TAGLIST",
|
||||||
|
"MYMPD_SEARCHTAGLIST", "MYMPD_BROWSETAGLIST", "MYMPD_SMARTPLS", "MYMPD_SYSCMDS",
|
||||||
|
"MYMPD_MAX_ELEMENTS_PER_PAGE", "MYMPD_LAST_PLAYED_COUNT",
|
||||||
|
"THEME_BACKGROUNDCOLOR", 0};
|
||||||
|
const char** ptr = env_vars;
|
||||||
|
while (*ptr != 0) {
|
||||||
|
mympd_parse_env(config, *ptr);
|
||||||
|
++ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
s_signal_received = 0;
|
s_signal_received = 0;
|
||||||
char testdirname[400];
|
char testdirname[400];
|
||||||
@ -223,34 +252,49 @@ int main(int argc, char **argv) {
|
|||||||
config->smartpls = true;
|
config->smartpls = true;
|
||||||
config->max_elements_per_page = 100;
|
config->max_elements_per_page = 100;
|
||||||
config->last_played_count = 20;
|
config->last_played_count = 20;
|
||||||
char *etcdir = strdup(argv[1]);
|
config->etcdir = strdup("/etc/mympd");
|
||||||
config->etcdir = strdup(dirname(etcdir));
|
|
||||||
free(etcdir);
|
|
||||||
config->syscmds = false;
|
config->syscmds = false;
|
||||||
config->localplayer = true;
|
config->localplayer = true;
|
||||||
config->loglevel = 1;
|
config->loglevel = 1;
|
||||||
config->backgroundcolor = strdup("#888");
|
config->backgroundcolor = strdup("#888");
|
||||||
|
|
||||||
|
char *configfile = strdup("/etc/mympd/mympd.conf");
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
|
if (strncmp(argv[1], "/", 1) == 0) {
|
||||||
printf("Starting myMPD %s\n", MYMPD_VERSION);
|
printf("Starting myMPD %s\n", MYMPD_VERSION);
|
||||||
printf("Libmpdclient %i.%i.%i\n", LIBMPDCLIENT_MAJOR_VERSION, LIBMPDCLIENT_MINOR_VERSION, LIBMPDCLIENT_PATCH_VERSION);
|
printf("Libmpdclient %i.%i.%i\n", LIBMPDCLIENT_MAJOR_VERSION, LIBMPDCLIENT_MINOR_VERSION, LIBMPDCLIENT_PATCH_VERSION);
|
||||||
printf("Parsing config file: %s\n", argv[1]);
|
free(configfile);
|
||||||
if (ini_parse(argv[1], inihandler, config) < 0) {
|
configfile = argv[1];
|
||||||
printf("Can't load config file \"%s\"\n", argv[1]);
|
char *etcdir = strdup(configfile);
|
||||||
goto cleanup;
|
free(config->etcdir);
|
||||||
}
|
config->etcdir = strdup(dirname(etcdir));
|
||||||
|
free(etcdir);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printf("myMPD %s\n"
|
printf("myMPD %s\n"
|
||||||
"Copyright (C) 2018-2019 Juergen Mang <mail@jcgames.de>\n"
|
"Copyright (C) 2018-2019 Juergen Mang <mail@jcgames.de>\n"
|
||||||
"https://github.com/jcorporation/myMPD\n"
|
"https://github.com/jcorporation/myMPD\n"
|
||||||
"Built " __DATE__ " "__TIME__"\n\n"
|
"Built " __DATE__ " "__TIME__"\n\n"
|
||||||
"Usage: %s /path/to/mympd.conf\n",
|
"Usage: %s [/path/to/mympd.conf]\n",
|
||||||
MYMPD_VERSION,
|
MYMPD_VERSION,
|
||||||
argv[0]
|
argv[0]
|
||||||
);
|
);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (access(configfile, F_OK ) != -1) {
|
||||||
|
printf("Parsing config file: %s\n", configfile);
|
||||||
|
if (ini_parse(configfile, mympd_inihandler, config) < 0) {
|
||||||
|
printf("Can't load config file \"%s\"\n", configfile);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("No config file found, using defaults\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//read environment - overwrites config file definitions
|
||||||
|
mympd_get_env(config);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("Debug flag enabled, setting loglevel to debug\n");
|
printf("Debug flag enabled, setting loglevel to debug\n");
|
||||||
@ -259,8 +303,9 @@ int main(int argc, char **argv) {
|
|||||||
printf("Setting loglevel to %ld\n", config->loglevel);
|
printf("Setting loglevel to %ld\n", config->loglevel);
|
||||||
loglevel = config->loglevel;
|
loglevel = config->loglevel;
|
||||||
|
|
||||||
signal(SIGTERM, signal_handler);
|
//set signal handler
|
||||||
signal(SIGINT, signal_handler);
|
signal(SIGTERM, mympd_signal_handler);
|
||||||
|
signal(SIGINT, mympd_signal_handler);
|
||||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||||
setvbuf(stderr, NULL, _IOLBF, 0);
|
setvbuf(stderr, NULL, _IOLBF, 0);
|
||||||
|
|
||||||
@ -369,6 +414,6 @@ int main(int argc, char **argv) {
|
|||||||
tiny_queue_free(web_server_queue);
|
tiny_queue_free(web_server_queue);
|
||||||
tiny_queue_free(mpd_client_queue);
|
tiny_queue_free(mpd_client_queue);
|
||||||
tiny_queue_free(mympd_api_queue);
|
tiny_queue_free(mympd_api_queue);
|
||||||
free_config(config);
|
mympd_free_config(config);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user