From e8f8c8e8c147ce305da76775562a9bc2d6dabb45 Mon Sep 17 00:00:00 2001 From: Geert Stappers Date: Sun, 8 Oct 2023 11:44:11 +0200 Subject: [PATCH 1/3] Help text change for serving directory Fixes a copy-and-paste error. Reported-by: jinxsong 123 --- src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.rs b/src/config.rs index 0a67240..7e7e1d2 100644 --- a/src/config.rs +++ b/src/config.rs @@ -88,7 +88,7 @@ impl Config { println!( " -p, --port \t\tSet the listening port of the server (default: 69)" ); - println!(" -d, --directory \tSet the listening port of the server (default: Current Working Directory)"); + println!(" -d, --directory \tSet the serving directory (default: Current Working Directory)"); println!(" -s, --single-port\t\tUse a single port for both sending and receiving (default: false)"); println!(" -r, --read-only\t\tRefuse all write requests, making the server read-only (default: false)"); println!(" --duplicate-packets \tDuplicate all packets sent from the server (default: 1)"); From bf7b2a2ee3cfa1b1bd86f6efbe152c9c536d29ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Altu=C4=9F=20Bakan?= Date: Sun, 8 Oct 2023 15:16:28 +0200 Subject: [PATCH 2/3] Update duplicate packet behavior --- src/config.rs | 28 ++++++++++++++++++---------- src/server.rs | 2 +- src/worker.rs | 8 ++++---- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/config.rs b/src/config.rs index 7e7e1d2..eb744f9 100644 --- a/src/config.rs +++ b/src/config.rs @@ -91,15 +91,20 @@ impl Config { println!(" -d, --directory \tSet the serving directory (default: Current Working Directory)"); println!(" -s, --single-port\t\tUse a single port for both sending and receiving (default: false)"); println!(" -r, --read-only\t\tRefuse all write requests, making the server read-only (default: false)"); - println!(" --duplicate-packets \tDuplicate all packets sent from the server (default: 1)"); + println!(" --duplicate-packets \tDuplicate all packets sent from the server (default: 0)"); println!(" -h, --help\t\t\tPrint help information"); process::exit(0); } "--duplicate-packets" => { if let Some(duplicate_packets_str) = args.next() { let duplicate_packets = duplicate_packets_str.parse::()?; - if duplicate_packets < 1 { - return Err("Duplicate packets must be greater than 0".into()); + + if duplicate_packets == u8::MAX { + return Err(format!( + "Duplicate packets should be less than {}", + u8::MAX + ) + .into()); } config.duplicate_packets = duplicate_packets; } else { @@ -178,13 +183,6 @@ mod tests { #[test] fn returns_error_on_invalid_duplicate_packets() { - assert!(Config::new( - ["/", "--duplicate-packets", "0"] - .iter() - .map(|s| s.to_string()), - ) - .is_err()); - assert!(Config::new( ["/", "--duplicate-packets", "-1"] .iter() @@ -192,4 +190,14 @@ mod tests { ) .is_err()); } + + #[test] + fn returns_error_on_max_duplicate_packets() { + assert!(Config::new( + ["/", "--duplicate-packets", format!("{}", u8::MAX).as_str()] + .iter() + .map(|s| s.to_string()), + ) + .is_err()); + } } diff --git a/src/server.rs b/src/server.rs index 436de8e..3ff390d 100644 --- a/src/server.rs +++ b/src/server.rs @@ -179,7 +179,7 @@ impl Server { worker_options.block_size, worker_options.timeout, worker_options.window_size, - self.duplicate_packets, + self.duplicate_packets + 1, ); worker.send() } diff --git a/src/worker.rs b/src/worker.rs index 3e39e83..6fd4801 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -43,7 +43,7 @@ pub struct Worker { blk_size: usize, timeout: Duration, windowsize: u16, - duplicate_packets: u8, + repeat_amount: u8, } impl Worker { @@ -54,7 +54,7 @@ impl Worker { blk_size: usize, timeout: Duration, windowsize: u16, - duplicate_packets: u8, + repeat_amount: u8, ) -> Worker { Worker { socket, @@ -62,7 +62,7 @@ impl Worker { blk_size, timeout, windowsize, - duplicate_packets, + repeat_amount, } } @@ -241,7 +241,7 @@ impl Worker { } fn send_packet(&self, packet: &Packet) -> Result<(), Box> { - for _ in 0..self.duplicate_packets { + for _ in 0..self.repeat_amount { self.socket.send(packet)?; } From 3af429fa4a40c2b7489fe739df726c593814fc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Altu=C4=9F=20Bakan?= Date: Sun, 8 Oct 2023 15:52:41 +0200 Subject: [PATCH 3/3] Add overwrite mode --- src/config.rs | 7 +++++ src/server.rs | 87 ++++++++++++++++++++++++++++----------------------- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/src/config.rs b/src/config.rs index eb744f9..c870d71 100644 --- a/src/config.rs +++ b/src/config.rs @@ -31,6 +31,8 @@ pub struct Config { pub read_only: bool, /// Duplicate all packets sent from the server. (default: 1) pub duplicate_packets: u8, + /// Overwrite existing files. (default: false) + pub overwrite: bool, } impl Config { @@ -44,6 +46,7 @@ impl Config { single_port: false, read_only: false, duplicate_packets: 1, + overwrite: false, }; args.next(); @@ -92,6 +95,7 @@ impl Config { println!(" -s, --single-port\t\tUse a single port for both sending and receiving (default: false)"); println!(" -r, --read-only\t\tRefuse all write requests, making the server read-only (default: false)"); println!(" --duplicate-packets \tDuplicate all packets sent from the server (default: 0)"); + println!(" --overwrite\t\t\tOverwrite existing files (default: false)"); println!(" -h, --help\t\t\tPrint help information"); process::exit(0); } @@ -111,6 +115,9 @@ impl Config { return Err("Missing duplicate packets after flag".into()); } } + "--overwrite" => { + config.overwrite = true; + } invalid => return Err(format!("Invalid flag: {invalid}").into()), } diff --git a/src/server.rs b/src/server.rs index 3ff390d..49eb300 100644 --- a/src/server.rs +++ b/src/server.rs @@ -32,6 +32,7 @@ pub struct Server { directory: PathBuf, single_port: bool, read_only: bool, + overwrite: bool, duplicate_packets: u8, largest_block_size: usize, clients: HashMap>, @@ -47,6 +48,7 @@ impl Server { directory: config.directory.clone(), single_port: config.single_port, read_only: config.read_only, + overwrite: config.overwrite, duplicate_packets: config.duplicate_packets, largest_block_size: DEFAULT_BLOCK_SIZE, clients: HashMap::new(), @@ -94,7 +96,7 @@ impl Server { { eprintln!("Could not send error packet"); }; - eprintln!("Received invalid request"); + eprintln!("Received write request while in read-only mode"); continue; } println!("Receiving {filename} from {from}"); @@ -194,15 +196,51 @@ impl Server { to: &SocketAddr, ) -> Result<(), Box> { let file_path = &self.directory.join(file_name); + let initialize_write = &mut || -> Result<(), Box> { + let worker_options = parse_options(options, RequestType::Write)?; + let mut socket: Box; + + if self.single_port { + let single_socket = create_single_socket(&self.socket, to)?; + self.clients.insert(*to, single_socket.sender()); + self.largest_block_size = max(self.largest_block_size, worker_options.block_size); + + socket = Box::new(single_socket); + } else { + socket = Box::new(create_multi_socket(&self.socket.local_addr()?, to)?); + } + + socket.set_read_timeout(worker_options.timeout)?; + socket.set_write_timeout(worker_options.timeout)?; + + accept_request(&socket, options, RequestType::Write)?; + + let worker = Worker::new( + socket, + file_path.clone(), + worker_options.block_size, + worker_options.timeout, + worker_options.window_size, + self.duplicate_packets, + ); + worker.receive() + }; + match check_file_exists(file_path, &self.directory) { - ErrorCode::FileExists => Socket::send_to( - &self.socket, - &Packet::Error { - code: ErrorCode::FileExists, - msg: "requested file already exists".to_string(), - }, - to, - ), + ErrorCode::FileExists => { + if self.overwrite { + initialize_write() + } else { + Socket::send_to( + &self.socket, + &Packet::Error { + code: ErrorCode::FileExists, + msg: "requested file already exists".to_string(), + }, + to, + ) + } + } ErrorCode::AccessViolation => Socket::send_to( &self.socket, &Packet::Error { @@ -211,36 +249,7 @@ impl Server { }, to, ), - ErrorCode::FileNotFound => { - let worker_options = parse_options(options, RequestType::Write)?; - let mut socket: Box; - - if self.single_port { - let single_socket = create_single_socket(&self.socket, to)?; - self.clients.insert(*to, single_socket.sender()); - self.largest_block_size = - max(self.largest_block_size, worker_options.block_size); - - socket = Box::new(single_socket); - } else { - socket = Box::new(create_multi_socket(&self.socket.local_addr()?, to)?); - } - - socket.set_read_timeout(worker_options.timeout)?; - socket.set_write_timeout(worker_options.timeout)?; - - accept_request(&socket, options, RequestType::Write)?; - - let worker = Worker::new( - socket, - file_path.clone(), - worker_options.block_size, - worker_options.timeout, - worker_options.window_size, - self.duplicate_packets, - ); - worker.receive() - } + ErrorCode::FileNotFound => initialize_write(), _ => Err("Unexpected error code when checking file".into()), } }