diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx index c277b6b73..ddeab463b 100644 --- a/src/Main/fg_commands.cxx +++ b/src/Main/fg_commands.cxx @@ -1349,6 +1349,10 @@ do_load_xml_to_proptree(const SGPropertyNode * arg) if (file.extension() != "xml") file.concat(".xml"); + if (file.isRelative()) { + file = globals->resolve_maybe_aircraft_path(file.str()); + } + if (!fgValidatePath(file.c_str(), false)) { SG_LOG(SG_IO, SG_ALERT, "loadxml: reading '" << file.str() << "' denied " "(unauthorized access)"); diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index 055ad879d..0a221fc6e 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -374,6 +374,19 @@ static naRef f_directory(naContext c, naRef me, int argc, naRef* args) return result; } +/** + * Given a data path, resolve it in FG_ROOT or an FG_AIRCRFT directory + */ +static naRef f_resolveDataPath(naContext c, naRef me, int argc, naRef* args) +{ + if(argc != 1 || !naIsString(args[0])) + naRuntimeError(c, "bad arguments to resolveDataPath()"); + + SGPath p = globals->resolve_maybe_aircraft_path(naStr_data(args[0])); + const char* pdata = p.c_str(); + return naStr_fromdata(naNewString(c), const_cast(pdata), strlen(pdata)); +} + // Parse XML file. // parsexml( [, [, [, [, ]]]]); // @@ -635,6 +648,7 @@ static struct { const char* name; naCFunction func; } funcs[] = { { "srand", f_srand }, { "abort", f_abort }, { "directory", f_directory }, + { "resolvepath", f_resolveDataPath }, { "parsexml", f_parsexml }, { "systime", f_systime }, { "carttogeod", f_carttogeod },