Guest User

Untitled

a guest
Nov 17th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.29 KB | None | 0 0
  1. use std::process::{Child, Command, Stdio};
  2. use std::os::unix::prelude::*;
  3. use std::fs::File;
  4. use std::io;
  5.  
  6. struct Redirect {
  7. pager: Child,
  8. }
  9.  
  10. fn redirect_stdout() -> io::Result<Redirect> {
  11. let mut pager = Command::new("less")
  12. .stdin(Stdio::piped())
  13. .arg("-FR")
  14. .spawn()?;
  15. let stdin = pager.stdin.take().unwrap();
  16.  
  17. unsafe {
  18. // redirect our stdout/stderr to the `less` child process
  19. if libc::dup2(stdin.as_raw_fd(), libc::STDOUT_FILENO) < 0 {
  20. return Err(io::Error::last_os_error())
  21. }
  22. if libc::dup2(stdin.as_raw_fd(), libc::STDERR_FILENO) < 0 {
  23. return Err(io::Error::last_os_error())
  24. }
  25. }
  26. Ok(Redirect { pager })
  27. }
  28.  
  29. impl Drop for Redirect {
  30. fn drop(&mut self) {
  31. unsafe {
  32. let null = File::open("/dev/null").unwrap();
  33. // "close" stdio streams now that our program is done
  34. assert!(libc::dup2(null.as_raw_fd(), libc::STDIN_FILENO) >= 0);
  35. assert!(libc::dup2(null.as_raw_fd(), libc::STDOUT_FILENO) >= 0);
  36. assert!(libc::dup2(null.as_raw_fd(), libc::STDERR_FILENO) >= 0);
  37. }
  38.  
  39. self.pager.wait().unwrap();
  40. }
  41. }
  42.  
  43. fn main() {
  44. let _pager = redirect_stdout().unwrap();
  45.  
  46. for i in 0..100 {
  47. println!("wut: {}", i);
  48. }
  49. }
Add Comment
Please, Sign In to add comment