#endif
#include <string.h>
+#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sstream>
#include <simgear/nasal/nasal.h>
+#include <simgear/nasal/iolib.h>
#include <simgear/props/props.hxx>
#include <simgear/math/sg_random.h>
#include <simgear/misc/sg_path.hxx>
return naNil();
}
+static naRef f_open(naContext c, naRef me, int argc, naRef* args)
+{
+ FILE* f;
+ naRef file = argc > 0 ? naStringValue(c, args[0]) : naNil();
+ naRef mode = argc > 1 ? naStringValue(c, args[1]) : naNil();
+ if(!naStr_data(file)) naRuntimeError(c, "bad argument to open()");
+ const char* modestr = naStr_data(mode) ? naStr_data(mode) : "rb";
+ std::string filename = fgValidatePath(naStr_data(file),
+ strcmp(modestr, "rb") && strcmp(modestr, "r"));
+ if(filename.empty()) {
+ naRuntimeError(c, "open(): reading/writing '%s' denied "
+ "(unauthorized access)", naStr_data(file));
+ return naNil();
+ }
+ f = fopen(filename.c_str(), modestr);
+ if(!f) naRuntimeError(c, strerror(errno));
+ return naIOGhost(c, f);
+}
+
// Parse XML file.
// parsexml(<path> [, <start-tag> [, <end-tag> [, <data> [, <pi>]]]]);
//
if(!(naIsNil(args[i]) || naIsFunc(args[i])))
naRuntimeError(c, "parsexml(): callback argument not a function");
- const char* file = fgValidatePath(naStr_data(args[0]), false);
- if(!file) {
+ std::string file = fgValidatePath(naStr_data(args[0]), false);
+ if(file.empty()) {
naRuntimeError(c, "parsexml(): reading '%s' denied "
"(unauthorized access)", naStr_data(args[0]));
return naNil();
}
- std::ifstream input(file);
+ std::ifstream input(file.c_str());
NasalXMLVisitor visitor(c, argc, args);
try {
readXML(input, visitor);
} catch (const sg_exception& e) {
naRuntimeError(c, "parsexml(): file '%s' %s",
- file, e.getFormattedMessage().c_str());
+ file.c_str(), e.getFormattedMessage().c_str());
return naNil();
}
- return naStr_fromdata(naNewString(c), const_cast<char*>(file), strlen(file));
+ return naStr_fromdata(naNewString(c), file.c_str(), file.length());
}
/**
for(i=0; funcs[i].name; i++)
hashset(_globals, funcs[i].name,
naNewFunc(_context, naNewCCode(_context, funcs[i].func)));
-
+ nasal::Hash io_module = nasal::Hash(_globals, _context).get<nasal::Hash>("io");
+ io_module.set("open", f_open);
+
// And our SGPropertyNode wrapper
hashset(_globals, "props", genPropsModule());
signal->setBoolValue(s, true);
signal->removeChildren(s);
- if( !checkIOrules() )
- {
- SG_LOG(SG_NASAL, SG_ALERT, "Required IOrules check failed.");
- exit(-1);
- }
-
// Pull scripts out of the property tree, too
loadPropertyScripts();
naGCRelease(key);
}
-//------------------------------------------------------------------------------
-bool FGNasalSys::checkIOrules()
-{
- // Ensure IOrules and path validation are working properly by trying to
- // access a folder/file which should never be accessible.
- const char* no_access_path =
-#ifdef _WIN32
- "Z:"
-#endif
- "/do-not-access";
-
- bool success = true;
-
- // write access
- if( fgValidatePath(no_access_path, true) )
- {
- success = false;
- SG_LOG
- (
- SG_GENERAL,
- SG_ALERT,
- "Check your IOrules! (write to '" << no_access_path << "' is allowed)"
- );
- }
-
- // read access
- if( fgValidatePath(no_access_path, false) )
- {
- success = false;
- SG_LOG
- (
- SG_GENERAL,
- SG_ALERT,
- "Check your IOrules! (read from '" << no_access_path << "' is allowed)"
- );
- }
-
- return success;
-}
//------------------------------------------------------------------------------
void FGNasalSys::NasalTimer::timerExpired()