aboutsummaryrefslogtreecommitdiff
path: root/src/tftpd.rs
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2019-03-03 14:02:17 +0100
committerReiner Herrmann <reiner@reiner-h.de>2019-03-03 14:02:17 +0100
commita62e0c10aed3639aedb0c228c7685926b391aae8 (patch)
tree3b37b1de5cc323d1755005439084aa6ff0a39e7c /src/tftpd.rs
parent960ea9072b03cf265a113c2ff978c0d2fb4735a3 (diff)
Implement Transfer Size Option (RFC 2349, part 2)
Diffstat (limited to 'src/tftpd.rs')
-rw-r--r--src/tftpd.rs8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/tftpd.rs b/src/tftpd.rs
index c424f7b..c85603d 100644
--- a/src/tftpd.rs
+++ b/src/tftpd.rs
@@ -76,7 +76,6 @@ impl Tftpd {
fn handle_wrq(&mut self, socket: &UdpSocket, cl: &SocketAddr, buf: &[u8]) -> Result<(), io::Error> {
let (filename, mode, mut options) = self.tftp.parse_file_mode_options(buf)?;
self.tftp.init_tftp_options(&socket, &mut options)?;
- self.tftp.ack_options(&socket, &options, false)?;
match mode.as_ref() {
"octet" => (),
@@ -109,6 +108,7 @@ impl Tftpd {
}
};
+ self.tftp.ack_options(&socket, &options, false)?;
match self.tftp.recv_file(&socket, &mut file) {
Ok(_) => println!("Received {} from {}.", path.display(), cl),
Err(ref err) => {
@@ -123,7 +123,6 @@ impl Tftpd {
fn handle_rrq(&mut self, socket: &UdpSocket, cl: &SocketAddr, buf: &[u8]) -> Result<(), io::Error> {
let (filename, mode, mut options) = self.tftp.parse_file_mode_options(buf)?;
self.tftp.init_tftp_options(&socket, &mut options)?;
- self.tftp.ack_options(&socket, &options, true)?;
match mode.as_ref() {
"octet" => (),
@@ -157,6 +156,11 @@ impl Tftpd {
self.tftp.send_error(&socket, 1, "File not found")?;
return Err(io::Error::new(io::ErrorKind::NotFound, "file not found"));
}
+
+ if let Some(opt) = options.get_mut("tsize") {
+ *opt = file.metadata()?.len().to_string();
+ }
+ self.tftp.ack_options(&socket, &options, true)?;
match self.tftp.send_file(&socket, &mut file) {
Ok(_) => println!("Sent {} to {}.", path.display(), cl),
Err(err) => println!("Sending {} to {} failed ({}).", path.display(), cl, err.to_string()),