make file creation lazy so that there are no more 0-byte files

This commit is contained in:
Astro 2022-09-24 01:22:49 +02:00
parent 1d4a72583f
commit 8e4cf7ad55

View File

@ -60,13 +60,9 @@ impl server::Server for Server {
); );
let path = Path::new(path); let path = Path::new(path);
create_dir_all(path.parent().unwrap()).unwrap(); create_dir_all(path.parent().unwrap()).unwrap();
let file = OpenOptions::new()
.create(true)
.append(true)
.open(path)
.unwrap();
Handler { Handler {
file, filename: path.display().to_string(),
lazy_file: None,
buffer: vec![], buffer: vec![],
user: "root".into(), user: "root".into(),
} }
@ -79,12 +75,25 @@ fn send_str(session: &mut Session, channel: ChannelId, s: String) {
} }
struct Handler { struct Handler {
file: File, filename: String,
lazy_file: Option<File>,
buffer: Vec<u8>, buffer: Vec<u8>,
user: String, user: String,
} }
impl Handler { impl Handler {
fn file(&mut self) -> &mut File {
if self.lazy_file.is_none() {
let file = OpenOptions::new()
.create(true)
.append(true)
.open(&self.filename)
.unwrap();
self.lazy_file = Some(file);
}
self.lazy_file.as_mut().unwrap()
}
fn send_prompt(&self, session: &mut Session, channel: ChannelId) { fn send_prompt(&self, session: &mut Session, channel: ChannelId) {
send_str(session, channel, format!("{}@fnordister:~$ ", self.user)); send_str(session, channel, format!("{}@fnordister:~$ ", self.user));
} }
@ -145,7 +154,7 @@ impl server::Handler for Handler {
fn exec_request(mut self, channel: ChannelId, data: &[u8], mut session: Session) -> Self::FutureUnit { fn exec_request(mut self, channel: ChannelId, data: &[u8], mut session: Session) -> Self::FutureUnit {
info!("exec_request"); info!("exec_request");
writeln!(self.file, "Execute: {}\n", String::from_utf8_lossy(data)) writeln!(self.file(), "Execute: {}\n", String::from_utf8_lossy(data))
.unwrap(); .unwrap();
let line = String::from_utf8_lossy(data).into(); let line = String::from_utf8_lossy(data).into();
@ -166,21 +175,21 @@ impl server::Handler for Handler {
session: Session session: Session
) -> Self::FutureUnit { ) -> Self::FutureUnit {
info!("subsystem_request"); info!("subsystem_request");
writeln!(self.file, "Subsystem requested: {}\n", name) writeln!(self.file(), "Subsystem requested: {}\n", name)
.unwrap(); .unwrap();
self.finished(session) self.finished(session)
} }
fn auth_password(mut self, user: &str, password: &str) -> Self::FutureAuth { fn auth_password(mut self, user: &str, password: &str) -> Self::FutureAuth {
writeln!(self.file, "Authenticated as {} with {}\n", user, password) writeln!(self.file(), "Authenticated as {} with {}\n", user, password)
.unwrap(); .unwrap();
self.user = user.into(); self.user = user.into();
self.finished_auth(server::Auth::Accept) self.finished_auth(server::Auth::Accept)
} }
fn data(mut self, channel: ChannelId, data: &[u8], mut session: Session) -> Self::FutureUnit { fn data(mut self, channel: ChannelId, data: &[u8], mut session: Session) -> Self::FutureUnit {
self.file.write(data) self.file().write(data)
.unwrap(); .unwrap();
// echo input back // echo input back
session.data(channel, data.to_vec().into()); session.data(channel, data.to_vec().into());