Implements status=LEVEL

- Adds print fn's
- Modifies internal fn's as needed to track read/write state
- Modifies status update thread to respect status level
- Adds signal handler for SIGUSR1 (print xfer stats)
This commit is contained in:
Tyler
2021-06-11 17:00:25 -07:00
parent a511db504b
commit fc110bb656
9 changed files with 476 additions and 145 deletions
Generated
+43
View File
@@ -134,6 +134,15 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40"
[[package]]
name = "byte-unit"
version = "4.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "063197e6eb4b775b64160dedde7a0986bb2836cce140e9492e9e96f28e18bcd8"
dependencies = [
"utf8-width",
]
[[package]]
name = "byteorder"
version = "1.3.4"
@@ -548,6 +557,12 @@ version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97"
[[package]]
name = "debug_print"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f215f9b7224f49fb73256115331f677d868b34d18b65dbe4db392e6021eea90"
[[package]]
name = "digest"
version = "0.6.2"
@@ -1370,6 +1385,25 @@ dependencies = [
"generic-array 0.8.4",
]
[[package]]
name = "signal-hook"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "470c5a6397076fae0094aaf06a08e6ba6f37acb77d3b1b91ea92b4d6c8650c39"
dependencies = [
"libc",
"signal-hook-registry",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
dependencies = [
"libc",
]
[[package]]
name = "smallvec"
version = "0.6.14"
@@ -1564,6 +1598,12 @@ dependencies = [
"log",
]
[[package]]
name = "utf8-width"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b"
[[package]]
name = "uu_arch"
version = "0.0.4"
@@ -1715,10 +1755,13 @@ dependencies = [
name = "uu_dd"
version = "0.0.4"
dependencies = [
"byte-unit",
"debug_print",
"gcd",
"getopts",
"hex-literal",
"md-5",
"signal-hook",
"uucore",
"uucore_procs",
]
+5 -2
View File
@@ -15,11 +15,14 @@ edition = "2018"
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" }
byte-unit = "4.0"
debug_print = "1.0"
# Probably best to keep this identical to the version of getopts in the uucore crate
getopts = "<= 0.2.21"
gcd = "2.0"
signal-hook = "0.3.9"
uucore = { version=">=0.0.7", package="uucore", path="../../uucore" }
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
[dev-dependencies]
md-5 = "0.9"
+373 -115
View File
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,18 @@
use super::*;
static NL: u8 = '\n' as u8;
static SPACE: u8 = ' ' as u8;
const NL: u8 = '\n' as u8;
const SPACE: u8 = ' ' as u8;
macro_rules! rs (
() =>
{
ReadStat {
reads_complete: 0,
reads_partial: 0,
records_truncated: 0,
}
};
);
macro_rules! make_block_test (
( $test_id:ident, $test_name:expr, $src:expr, $block:expr, $spec:expr ) =>
@@ -12,7 +23,7 @@ macro_rules! make_block_test (
src: $src,
non_ascii: false,
ibs: 512,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: IConvFlags {
ctable: None,
block: $block,
@@ -44,7 +55,7 @@ macro_rules! make_unblock_test (
src: $src,
non_ascii: false,
ibs: 512,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: IConvFlags {
ctable: None,
block: None,
@@ -70,8 +81,9 @@ macro_rules! make_unblock_test (
#[test]
fn block_test_no_nl()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8],
@@ -81,8 +93,9 @@ fn block_test_no_nl()
#[test]
fn block_test_no_nl_short_record()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8];
let res = block(buf, 8);
let res = block(buf, 8, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE],
@@ -92,19 +105,22 @@ fn block_test_no_nl_short_record()
#[test]
fn block_test_no_nl_trunc()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, 4u8];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8/*, 4u8*/],
]);
assert_eq!(rs.records_truncated, 1);
}
#[test]
fn block_test_nl_gt_cbs_trunc()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, 4u8, NL, 0u8, 1u8, 2u8, 3u8, 4u8, NL, 5u8, 6u8, 7u8, 8u8];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8],
@@ -113,13 +129,15 @@ fn block_test_nl_gt_cbs_trunc()
// vec![4u8, SPACE, SPACE, SPACE],
vec![5u8, 6u8, 7u8, 8u8],
]);
assert_eq!(rs.records_truncated, 2);
}
#[test]
fn block_test_surrounded_nl()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, NL, 4u8, 5u8, 6u8, 7u8, 8u8];
let res = block(buf, 8);
let res = block(buf, 8, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE],
@@ -130,8 +148,9 @@ fn block_test_surrounded_nl()
#[test]
fn block_test_multiple_nl_same_cbs_block()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, NL, 4u8, NL, 5u8, 6u8, 7u8, 8u8, 9u8];
let res = block(buf, 8);
let res = block(buf, 8, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE],
@@ -143,8 +162,9 @@ fn block_test_multiple_nl_same_cbs_block()
#[test]
fn block_test_multiple_nl_diff_cbs_block()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, NL, 4u8, 5u8, 6u8, 7u8, NL, 8u8, 9u8];
let res = block(buf, 8);
let res = block(buf, 8, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE],
@@ -156,8 +176,9 @@ fn block_test_multiple_nl_diff_cbs_block()
#[test]
fn block_test_end_nl_diff_cbs_block()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, NL];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8],
@@ -167,8 +188,9 @@ fn block_test_end_nl_diff_cbs_block()
#[test]
fn block_test_end_nl_same_cbs_block()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, NL];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, SPACE]
@@ -178,8 +200,9 @@ fn block_test_end_nl_same_cbs_block()
#[test]
fn block_test_double_end_nl()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, NL, NL];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, SPACE],
@@ -190,8 +213,9 @@ fn block_test_double_end_nl()
#[test]
fn block_test_start_nl()
{
let mut rs = rs!();
let buf = vec![NL, 0u8, 1u8, 2u8, 3u8];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![SPACE, SPACE, SPACE, SPACE],
@@ -202,8 +226,9 @@ fn block_test_start_nl()
#[test]
fn block_test_double_surrounded_nl_no_trunc()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, NL, NL, 4u8, 5u8, 6u8, 7u8];
let res = block(buf, 8);
let res = block(buf, 8, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE],
@@ -215,14 +240,16 @@ fn block_test_double_surrounded_nl_no_trunc()
#[test]
fn block_test_double_surrounded_nl_double_trunc()
{
let mut rs = rs!();
let buf = vec![0u8, 1u8, 2u8, 3u8, NL, NL, 4u8, 5u8, 6u8, 7u8, 8u8];
let res = block(buf, 4);
let res = block(buf, 4, &mut rs);
assert_eq!(res, vec![
vec![0u8, 1u8, 2u8, 3u8],
vec![SPACE, SPACE, SPACE, SPACE],
vec![4u8, 5u8, 6u8, 7u8/*, 8u8*/],
]);
assert_eq!(rs.records_truncated, 1);
}
make_block_test!(
@@ -9,8 +9,8 @@ impl<R: Read> Read for LazyReader<R>
{
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>
{
let half = buf.len() / 2;
self.src.read(&mut buf[..half])
let reduced = cmp::max(buf.len() / 2, 1);
self.src.read(&mut buf[..reduced])
}
}
@@ -23,7 +23,7 @@ macro_rules! make_sync_test (
src: $src,
non_ascii: false,
ibs: $ibs,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: IConvFlags {
ctable: None,
block: None,
@@ -9,7 +9,7 @@ macro_rules! make_conv_test (
src: $src,
non_ascii: false,
ibs: 512,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: icf!($ctable),
iflags: DEFAULT_IFLAGS,
},
@@ -34,7 +34,7 @@ macro_rules! make_icf_test (
src: $src,
non_ascii: false,
ibs: 512,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: $icf,
iflags: DEFAULT_IFLAGS,
},
@@ -137,7 +137,7 @@ fn all_valid_ascii_ebcdic_ascii_roundtrip_conv_test()
src: File::open("./test-resources/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test").unwrap(),
non_ascii: false,
ibs: 128,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: icf!(Some(&ASCII_TO_EBCDIC)),
iflags: DEFAULT_IFLAGS,
};
@@ -159,7 +159,7 @@ fn all_valid_ascii_ebcdic_ascii_roundtrip_conv_test()
src: File::open(&tmp_fname_ae).unwrap(),
non_ascii: false,
ibs: 256,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: icf!(Some(&EBCDIC_TO_ASCII)),
iflags: DEFAULT_IFLAGS,
};
+1 -1
View File
@@ -94,7 +94,7 @@ macro_rules! make_spec_test (
src: $src,
non_ascii: false,
ibs: 512,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: icf!(),
iflags: DEFAULT_IFLAGS,
},
+2 -2
View File
@@ -31,7 +31,7 @@ make_spec_test!(
src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(),
non_ascii: false,
ibs: 521,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: icf!(),
iflags: DEFAULT_IFLAGS,
},
@@ -52,7 +52,7 @@ make_spec_test!(
src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(),
non_ascii: false,
ibs: 1031,
xfer_stats: StatusLevel::None,
xfer_stats: None,
cflags: icf!(),
iflags: DEFAULT_IFLAGS,
},
+1 -1
View File
@@ -297,7 +297,7 @@ fn parse_cbs(matches: &getopts::Matches) -> Result<Option<usize>, ParseError>
}
}
pub fn parse_status_level(matches: &getopts::Matches) -> Result<StatusLevel, ParseError>
pub fn parse_status_level(matches: &getopts::Matches) -> Result<Option<StatusLevel>, ParseError>
{
unimplemented!()
}