aboutsummaryrefslogtreecommitdiff
path: root/src/tftpd.rs
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2019-02-26 19:55:53 +0100
committerReiner Herrmann <reiner@reiner-h.de>2019-02-26 19:55:53 +0100
commit5603adb233adc0bfa0eff1c24543831e07aebd4b (patch)
treed862a84d8b44aba16f103aadf3657bad73317424 /src/tftpd.rs
parentae95a4ba75c63a26ed0e30eb67c8791b9e7100c9 (diff)
Don't overwrite files if they already exist
Diffstat (limited to 'src/tftpd.rs')
-rw-r--r--src/tftpd.rs17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/tftpd.rs b/src/tftpd.rs
index b84fd20..60f5b90 100644
--- a/src/tftpd.rs
+++ b/src/tftpd.rs
@@ -1,4 +1,5 @@
use std::net::{SocketAddr,UdpSocket};
+use std::fs::OpenOptions;
use std::fs::File;
use std::path::{Path,PathBuf};
use std::error::Error;
@@ -130,8 +131,11 @@ fn send_file(socket: &UdpSocket, path: &Path) -> Result<(), io::Error> {
}
fn recv_file(sock: &UdpSocket, path: &PathBuf) -> Result<(), io::Error> {
- let mut file = match File::create(path) {
+ let mut file = match OpenOptions::new().write(true).create_new(true).open(path) {
Ok(f) => f,
+ Err(ref err) if err.kind() == io::ErrorKind::AlreadyExists => {
+ return Err(io::Error::new(err.kind(), "already exists"));
+ },
Err(_) => return Err(io::Error::new(io::ErrorKind::PermissionDenied, "permission denied")),
};
@@ -237,13 +241,16 @@ fn handle_wrq(socket: &UdpSocket, cl: &SocketAddr, buf: &[u8]) -> Result<(), io:
match recv_file(&socket, &path) {
Ok(_) => println!("Received {} from {}.", path.display(), cl),
- Err(err) => {
+ Err(ref err) => {
println!("Receiving {} from {} failed ({}).", path.display(), cl, err.to_string());
- send_error(&socket, 0, "Receiving error")?;
- return Ok(())
+ match err.kind() {
+ io::ErrorKind::PermissionDenied => send_error(&socket, 2, "Permission denied")?,
+ io::ErrorKind::AlreadyExists => send_error(&socket, 6, "File already exists")?,
+ _ => send_error(&socket, 0, "Receiving error")?,
+ }
+ return Err(io::Error::new(err.kind(), err.to_string()));
}
}
-
Ok(())
}