added working_dir to config

This commit is contained in:
2026-06-10 00:00:51 +05:00
parent ccc788bbdc
commit 9c25f6f0d2
3 changed files with 37 additions and 5 deletions

View File

@@ -1,5 +1,6 @@
main_assembly_path="Program.dll" main_assembly_path="Program.dll"
mono_libs_dir="mono-libs" mono_libs_dir="mono-libs"
working_dir=""
# error, critical, warning, message, info, debug (default=error) # error, critical, warning, message, info, debug (default=error)
trace_level="" trace_level=""

View File

@@ -15,6 +15,7 @@ static const cstr DOMAIN_NAME = "mono-apphost";
typedef struct ApphostConfig { typedef struct ApphostConfig {
char* main_assembly_path; char* main_assembly_path;
char* mono_libs_dir; char* mono_libs_dir;
NULLABLE(char*) working_dir;
// error, critical, warning, message, info, debug (default=error) // error, critical, warning, message, info, debug (default=error)
NULLABLE(char*) trace_level; NULLABLE(char*) trace_level;
@@ -30,6 +31,7 @@ void ApphostConfig_free(ApphostConfig* conf){
return; return;
free(conf->main_assembly_path); free(conf->main_assembly_path);
free(conf->mono_libs_dir); free(conf->mono_libs_dir);
free(conf->working_dir);
free(conf->trace_level); free(conf->trace_level);
free(conf->trace_mask); free(conf->trace_mask);
free(conf); free(conf);
@@ -95,9 +97,33 @@ Result(ApphostConfig*) ApphostConfig_load_filename(cstr _conf_path_raw){
conf->mono_libs_dir = str_copy(*mono_libs_dir).data; conf->mono_libs_dir = str_copy(*mono_libs_dir).data;
// working_dir
NULLABLE(TomlValue*) working_dir = TomlTable_tryGet(config_top, STR("working_dir"));
if(working_dir){
if(working_dir->type != TLIBTOML_STRING){
Return RESULT_ERROR_LITERAL("working_dir: value must be a string");
}
if(working_dir->s->len != 0){
path_fix_separators(working_dir->s);
if(!dir_exists(working_dir->s->data)){
char* err = sprintf_malloc(
"working_dir: directory '%s' doesn't exist",
working_dir->s->data);
Return RESULT_ERROR_HEAP(err);
}
conf->working_dir = str_copy(*working_dir->s).data;
}
}
// trace_level // trace_level
NULLABLE(TomlValue*) trace_level = TomlTable_tryGet(config_top, STR("trace_level")); NULLABLE(TomlValue*) trace_level = TomlTable_tryGet(config_top, STR("trace_level"));
if(trace_level){ if(trace_level){
if(trace_level->type != TLIBTOML_STRING){
Return RESULT_ERROR_LITERAL("trace_level: value must be a string");
}
if(trace_level->s->len != 0) if(trace_level->s->len != 0)
conf->trace_level = str_copy(*trace_level->s).data; conf->trace_level = str_copy(*trace_level->s).data;
} }
@@ -105,6 +131,9 @@ Result(ApphostConfig*) ApphostConfig_load_filename(cstr _conf_path_raw){
// trace_mask // trace_mask
NULLABLE(TomlValue*) trace_mask = TomlTable_tryGet(config_top, STR("trace_mask")); NULLABLE(TomlValue*) trace_mask = TomlTable_tryGet(config_top, STR("trace_mask"));
if(trace_mask){ if(trace_mask){
if(trace_mask->type != TLIBTOML_STRING){
Return RESULT_ERROR_LITERAL("trace_mask: value must be a string");
}
if(trace_mask->s->len != 0) if(trace_mask->s->len != 0)
conf->trace_mask = str_copy(*trace_mask->s).data; conf->trace_mask = str_copy(*trace_mask->s).data;
} }
@@ -115,15 +144,13 @@ Result(ApphostConfig*) ApphostConfig_load_filename(cstr _conf_path_raw){
void trace_print_handler(const char *message, mono_bool is_stdout){ void trace_print_handler(const char *message, mono_bool is_stdout){
FILE* stream = is_stdout ? stdout : stderr; printfe("[MonoPrint]: %s\n", message);
fprintf(stream, "[MonoPrint]: %s\n", message);
} }
void trace_log_handler(const char *log_domain, const char *log_level, const char *message, void trace_log_handler(const char *log_domain, const char *log_level, const char *message,
mono_bool fatal, void *user_data) mono_bool fatal, void *user_data)
{ {
FILE* stream = stderr; printfe("[%s/%s]: %s\n", log_domain, log_level, message);
fprintf(stream, "[%s/%s]: %s\n", log_domain, log_level, message);
} }
@@ -177,6 +204,10 @@ Result(i32) try_main(i32 argc, cstr* argv){
try(MonoAssembly* assembly, p, load_assembly(domain, conf->main_assembly_path)) try(MonoAssembly* assembly, p, load_assembly(domain, conf->main_assembly_path))
if(conf->working_dir){
try_void(dir_setCurrent(conf->working_dir));
}
i32 ret = mono_jit_exec(domain, assembly, argc, (char**)(argv)); i32 ret = mono_jit_exec(domain, assembly, argc, (char**)(argv));
Return RESULT_VALUE(i, ret); Return RESULT_VALUE(i, ret);
} }