diff --git a/src/tail/tail.rs b/src/tail/tail.rs index d44c2afdf..9e665540c 100755 --- a/src/tail/tail.rs +++ b/src/tail/tail.rs @@ -146,8 +146,8 @@ pub fn uumain(args: Vec) -> i32 { let files = given_options.free; if files.is_empty() { - let buffer = BufReader::new(stdin()); - unbounded_tail(buffer, &settings); + let mut buffer = BufReader::new(stdin()); + unbounded_tail(&mut buffer, &settings); } else { let mut multiple = false; let mut first_header = true; @@ -168,12 +168,19 @@ pub fn uumain(args: Vec) -> i32 { if path.is_dir() { continue; } - let file = File::open(&path).unwrap(); - bounded_tail(&file, &settings); - - if settings.follow { - let reader = BufReader::new(file); - readers.push(reader); + let mut file = File::open(&path).unwrap(); + if is_seekable(&mut file) { + bounded_tail(&file, &settings); + if settings.follow { + let reader = BufReader::new(file); + readers.push(reader); + } + } else { + let mut reader = BufReader::new(file); + unbounded_tail(&mut reader, &settings); + if settings.follow { + readers.push(reader); + } } } @@ -419,7 +426,7 @@ fn bounded_tail(mut file: &File, settings: &Settings) { } } -fn unbounded_tail(mut reader: BufReader, settings: &Settings) { +fn unbounded_tail(reader: &mut BufReader, settings: &Settings) { // Read through each line/char and store them in a ringbuffer that always // contains count lines/chars. When reaching the end of file, output the // data in the ringbuf. @@ -487,10 +494,10 @@ fn unbounded_tail(mut reader: BufReader, settings: &Settings) { } } } +} - if settings.follow { - follow(&mut [reader], &["stdin".to_string()], settings); - } +fn is_seekable(file: &mut T) -> bool { + file.seek(SeekFrom::Current(0)).is_ok() } #[inline] diff --git a/tests/test_tail.rs b/tests/test_tail.rs index 6ff2255c9..333018621 100644 --- a/tests/test_tail.rs +++ b/tests/test_tail.rs @@ -80,13 +80,7 @@ fn test_follow_multiple() { #[test] fn test_follow_stdin() { - let (at, mut ucmd) = at_and_ucmd(); - let mut child = ucmd.arg("-f").pipe_in(at.read(FOOBAR_TXT)).run_no_wait(); - - let expected = at.read("follow_stdin.expected"); - assert_eq!(read_size(&mut child, expected.len()), expected); - - child.kill().unwrap(); + new_ucmd().arg("-f").pipe_in_fixture(FOOBAR_TXT).run().stdout_is_fixture("follow_stdin.expected"); } #[test]