+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()) {
+ SG_LOG(SG_NASAL, SG_ALERT, "open(): reading/writing '" <<
+ naStr_data(file) << "' denied (unauthorized directory - authorization"
+ " no longer follows symlinks; to authorize reading additional "
+ "directories, add them to --fg-aircraft)");
+ naRuntimeError(c, "open(): access denied (unauthorized directory)");
+ return naNil();
+ }
+ f = fopen(filename.c_str(), modestr);
+ if(!f) naRuntimeError(c, strerror(errno));
+ return naIOGhost(c, f);
+}
+