aboutsummaryrefslogtreecommitdiffhomepage
path: root/config.c
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2020-04-27 22:50:47 +0200
committercbdev <cb@cbcdn.com>2020-04-27 22:50:47 +0200
commit1d8ed32bf769bc99095cd32ec166e681437607f0 (patch)
treebc94fd3a0245e91c15659916fc1c3591c7fb44b7 /config.c
parentd4714dfdd5c6e2d165d1ad9327fdce69a1b2b85b (diff)
parentc0bb55ff08faf2f89af947090d1c9bc412927d9f (diff)
downloadmidimonster-1d8ed32bf769bc99095cd32ec166e681437607f0.tar.gz
midimonster-1d8ed32bf769bc99095cd32ec166e681437607f0.tar.bz2
midimonster-1d8ed32bf769bc99095cd32ec166e681437607f0.zip
Merge branch 'master' into debian/master
Diffstat (limited to 'config.c')
-rw-r--r--config.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/config.c b/config.c
index 920e161..11e8a70 100644
--- a/config.c
+++ b/config.c
@@ -2,6 +2,11 @@
#include <ctype.h>
#include <unistd.h>
#include <errno.h>
+#ifndef _WIN32
+#include <limits.h>
+#endif
+
+#define BACKEND_NAME "core/cfg"
#include "midimonster.h"
#include "config.h"
#include "backend.h"
@@ -349,6 +354,10 @@ static int config_line(char* line){
}
}
}
+ else if(!strncmp(line, "[include ", 9)){
+ line[strlen(line) - 1] = 0;
+ return config_read(line + 9);
+ }
else if(!strcmp(line, "[map]")){
//mapping configuration
parser_state = map;
@@ -388,7 +397,7 @@ static int config_line(char* line){
return 1;
}
- current_instance = mm_instance();
+ current_instance = mm_instance(current_backend);
if(!current_instance){
return 1;
}
@@ -493,7 +502,7 @@ int config_read(char* cfg_filepath){
char* line_raw = NULL;
//create heap copy of file name because original might be in readonly memory
- char* source_dir = strdup(cfg_filepath), *source_file = NULL;
+ char* source_dir = strdup(cfg_filepath), *source_file = NULL, original_dir[PATH_MAX * 2] = "";
#ifdef _WIN32
char path_separator = '\\';
#else
@@ -510,6 +519,12 @@ int config_read(char* cfg_filepath){
if(source_file){
*source_file = 0;
source_file++;
+
+ if(!getcwd(original_dir, sizeof(original_dir))){
+ fprintf(stderr, "Failed to read current working directory: %s\n", strerror(errno));
+ goto bail;
+ }
+
if(chdir(source_dir)){
fprintf(stderr, "Failed to change to configuration file directory %s: %s\n", source_dir, strerror(errno));
goto bail;
@@ -519,10 +534,11 @@ int config_read(char* cfg_filepath){
source_file = source_dir;
}
+ fprintf(stderr, "Reading configuration file %s\n", cfg_filepath);
source = fopen(source_file, "r");
if(!source){
- fprintf(stderr, "Failed to open configuration file for reading\n");
+ fprintf(stderr, "Failed to open %s for reading\n", cfg_filepath);
goto bail;
}
@@ -536,6 +552,11 @@ int config_read(char* cfg_filepath){
rv = 0;
bail:
+ //change back to previous directory to allow recursive configuration file parsing
+ if(source_file && source_dir != source_file){
+ chdir(original_dir);
+ }
+
free(source_dir);
if(source){
fclose(source);