open pl files instead of directories (#2014)

This commit is contained in:
Mark
2023-11-28 15:31:00 -07:00
parent bc3ae52c7a
commit 631674db29

View File

@@ -27,6 +27,7 @@ use std::io::{Cursor, ErrorKind, Read, Seek, SeekFrom, Write};
use std::mem; use std::mem;
use std::net::{Shutdown, TcpStream}; use std::net::{Shutdown, TcpStream};
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
use std::path::PathBuf;
use std::ptr; use std::ptr;
#[cfg(feature = "tls")] #[cfg(feature = "tls")]
@@ -1837,42 +1838,55 @@ impl MachineState {
} }
}; };
let file = match open_options.open(&*file_spec.as_str()) { let mut path = PathBuf::from(&*file_spec.as_str());
Ok(file) => file,
Err(err) => {
match err.kind() {
ErrorKind::NotFound => {
// 8.11.5.3j)
let stub = functor_stub(atom!("open"), 4);
let err = loop {
self.existence_error(ExistenceError::SourceSink(self[temp_v!(1)])); let file = match open_options.open(&path) {
Ok(file) => file,
Err(err) => {
match err.kind() {
ErrorKind::NotFound => {
// 8.11.5.3j)
let stub = functor_stub(atom!("open"), 4);
return Err(self.error_form(err, stub)); let err =
self.existence_error(ExistenceError::SourceSink(self[temp_v!(1)]));
return Err(self.error_form(err, stub));
}
ErrorKind::PermissionDenied => {
// 8.11.5.3k)
return Err(self.open_permission_error(
self.registers[1],
atom!("open"),
4,
));
}
_ => {
// assume the OS is out of file descriptors.
let stub = functor_stub(atom!("open"), 4);
let err = self.resource_error(ResourceError::OutOfFiles);
return Err(self.error_form(err, stub));
}
} }
ErrorKind::PermissionDenied => { }
// 8.11.5.3k) };
return Err(self.open_permission_error(
self.registers[1],
atom!("open"),
4,
));
}
_ => {
// assume the OS is out of file descriptors.
let stub = functor_stub(atom!("open"), 4);
let err = self.resource_error(ResourceError::OutOfFiles);
return Err(self.error_form(err, stub)); if path.extension().is_none() {
if let Some(metadata) = file.metadata().ok() {
if metadata.is_dir() {
path.set_extension("pl");
continue;
} }
} }
} }
};
Ok(if is_input_file { return Ok(if is_input_file {
Stream::from_file_as_input(file_spec, file, &mut self.arena) Stream::from_file_as_input(file_spec, file, &mut self.arena)
} else { } else {
Stream::from_file_as_output(file_spec, file, in_append_mode, &mut self.arena) Stream::from_file_as_output(file_spec, file, in_append_mode, &mut self.arena)
}) });
}
} }
} }