Redirect and/or gag stdout/stderr.

Documentation (with examples): https://docs.rs/gag/
Limitations
- Doesn't work on windows. Patches welcome.
- Won't work if something else has called
std::io::set_print
(currently
unstable). Unfortunately, this function doesn't actually redirect the stdio
file descriptor, it just replaces the std::io::stdout
writer.
- Won't work in rust test cases. The rust test cases use
std::io::set_print
to
redirect stdout.
TODO:
- General:
- Windows support.
- Better error handling?
- Redirect:
- Be generic over references. That is, accept both a reference to an AsRawFd or
an AsRawFd. Unfortunately, I don't know if this is even possible. Borrow
doesn't work because I really want the following constraint:
impl<F> Redirect<F> where F: BorrowMut<T>, T: AsMut<AsRawFd>
so I can write
file.borrow_mut().as_mut()
but that would be ambiguous...
- Buffer:
- Deallocate the buffer as it is read (FALLOCFLPUNCH_HOLE) if possible.