diff --git a/Cargo.lock b/Cargo.lock index ebb288d3d..fe0440d73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "advapi32-sys" version = "0.2.0" @@ -219,6 +221,7 @@ dependencies = [ "uu_csplit 0.0.4", "uu_cut 0.0.4", "uu_date 0.0.4", + "uu_dd 0.0.4", "uu_df 0.0.4", "uu_dircolors 0.0.4", "uu_dirname 0.0.4", @@ -1495,6 +1498,14 @@ dependencies = [ "uucore_procs 0.0.5", ] +[[package]] +name = "uu_dd" +version = "0.0.4" +dependencies = [ + "uucore 0.0.7", + "uucore_procs 0.0.5", +] + [[package]] name = "uu_df" version = "0.0.4" diff --git a/Cargo.toml b/Cargo.toml index 9b55abe5c..786c66fe3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -150,6 +150,7 @@ feat_require_unix = [ "chown", "chroot", "du", + "dd", "groups", "hostid", "id", @@ -249,6 +250,7 @@ df = { optional=true, version="0.0.4", package="uu_df", path="src/uu/df" } dircolors= { optional=true, version="0.0.4", package="uu_dircolors", path="src/uu/dircolors" } dirname = { optional=true, version="0.0.4", package="uu_dirname", path="src/uu/dirname" } du = { optional=true, version="0.0.4", package="uu_du", path="src/uu/du" } +dd = { optional=true, version="0.0.4", package="uu_dd", path="src/uu/dd" } echo = { optional=true, version="0.0.4", package="uu_echo", path="src/uu/echo" } env = { optional=true, version="0.0.4", package="uu_env", path="src/uu/env" } expand = { optional=true, version="0.0.4", package="uu_expand", path="src/uu/expand" } diff --git a/src/uu/dd/Cargo.toml b/src/uu/dd/Cargo.toml new file mode 100644 index 000000000..0a7a945bf --- /dev/null +++ b/src/uu/dd/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "uu_dd" +version = "0.0.4" +authors = ["uutils developers"] +license = "MIT" +description = "dd ~ (uutils) copy and convert files" + +homepage = "https://github.com/uutils/coreutils" +repository = "https://github.com/uutils/coreutils/tree/master/src/uu/dd" +keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] +categories = ["command-line-utilities"] +edition = "2018" + +[lib] +path = "src/dd.rs" + +[dependencies] +uucore = { version=">=0.0.7", package="uucore", path="../../uucore" } +uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" } + +[[bin]] +name = "dd" +path = "src/main.rs" diff --git a/src/uu/dd/Makefile b/src/uu/dd/Makefile new file mode 100644 index 000000000..bd6462c41 --- /dev/null +++ b/src/uu/dd/Makefile @@ -0,0 +1,15 @@ +## +# Test runner +# +# @file +# @version 0.1 + +all: int unit + +int: + cargo test --features "dd" --no-default-features --manifest-path "../../../Cargo.toml" + +unit: + cargo test --manifest-path "./Cargo.toml" + +# end diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs new file mode 100644 index 000000000..d2a0a0fa4 --- /dev/null +++ b/src/uu/dd/src/dd.rs @@ -0,0 +1,109 @@ +// This file is part of the uutils coreutils package. +// +// (c) Tyler Steele +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +// spell-checker:ignore (T0DO) + +#[macro_use] +extern crate uucore; + +use std::error::Error; +use std::io; +use std::sync::mpsc; +use std::thread; + +const NAME: &str = "dd"; +const SUMMARY: &str = "Copies, and optionally converts, file system resources."; +const LONG_HELP: &str = " +TODO: This is where the long help string for dd goes! +"; + +struct Input +{ + src: Box, +} + +impl Input +{ + fn run(&self, tx: mpsc::SyncSender>) -> Result<(), Box> + { + let buff = vec![0; 128]; + let msg = self.src.read(&buff)?; + + println!("Sender sending:\t\t{:?}", &msg); + tx.send(msg)?; + + Ok(()) + } +} + +struct Output +{ + dst: Box, +} + +impl Output +{ + fn run(&self, rx: mpsc::Receiver>) -> Result<(), Box> + { + let data = rx.recv()?; + + println!("Receiver received:\t{:?}", data); + + Ok(()) + } +} + +fn dd(i: Input, o: Output) -> () +{ + let (tx, rx) = mpsc::sync_channel(0); // each send will block until the recv'r is ready for it + + thread::spawn(move || { + i.run(tx); + }); + + thread::spawn(move || { + o.run(rx); + }); + + loop{}; +} + +pub fn uumain(args: impl uucore::Args) -> i32 +{ + // TODO: parse args + + -1 +} + +#[cfg(test)] +mod test_dd_internal { + #[allow(unused_imports)] + use super::*; + + #[test] + fn hello_world_test() + { + let (src, dst) = mpsc::channel(); + let data = vec![0xFF; 128]; + + for c in data { + src.send(c); + } + + let i = Input { + src: Box::new(src), + }; + + let o = Output { + dst: Box::new(dst), + }; + + dd(i,o); + + assert_eq!(data, dst); + } +} diff --git a/src/uu/dd/src/main.rs b/src/uu/dd/src/main.rs new file mode 100644 index 000000000..fb6f5a6f5 --- /dev/null +++ b/src/uu/dd/src/main.rs @@ -0,0 +1 @@ +uucore_procs::main!(uu_dd); // spell-checker:ignore procs uucore diff --git a/tests/by-util/test_dd.rs b/tests/by-util/test_dd.rs new file mode 100644 index 000000000..2a010b4e3 --- /dev/null +++ b/tests/by-util/test_dd.rs @@ -0,0 +1,7 @@ +use crate::common::util::*; + +#[test] +fn fail_from_test_dd() +{ + panic!() +}