Better failure detection in getty
This commit is contained in:
+39
-21
@@ -3,7 +3,40 @@
|
||||
extern crate syscall;
|
||||
|
||||
use std::process::Command;
|
||||
use std::{env, str};
|
||||
use std::{env, process, str};
|
||||
use std::io::{self, Write};
|
||||
|
||||
fn set_tty(tty: &str) -> syscall::Result<()> {
|
||||
let stdin = syscall::open(tty, syscall::flag::O_RDONLY)?;
|
||||
let stdout = syscall::open(tty, syscall::flag::O_WRONLY)?;
|
||||
let stderr = syscall::open(tty, syscall::flag::O_WRONLY)?;
|
||||
|
||||
syscall::dup2(stdin, 0, &[])?;
|
||||
syscall::dup2(stdout, 1, &[])?;
|
||||
syscall::dup2(stderr, 2, &[])?;
|
||||
|
||||
let _ = syscall::close(stdin);
|
||||
let _ = syscall::close(stdout);
|
||||
let _ = syscall::close(stderr);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn daemon() {
|
||||
loop {
|
||||
if clear {
|
||||
syscall::write(1, b"\x1Bc").unwrap();
|
||||
}
|
||||
syscall::fsync(1).unwrap();
|
||||
match Command::new("login").spawn() {
|
||||
Ok(mut child) => match child.wait() {
|
||||
Ok(_status) => (), //println!("getty: waited for login: {:?}", status.code()),
|
||||
Err(err) => panic!("getty: failed to wait for login: {}", err)
|
||||
},
|
||||
Err(err) => panic!("getty: failed to execute login: {}", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let mut tty_option = None;
|
||||
@@ -20,13 +53,10 @@ pub fn main() {
|
||||
}
|
||||
|
||||
if let Some(tty) = tty_option {
|
||||
let _ = syscall::close(2);
|
||||
let _ = syscall::close(1);
|
||||
let _ = syscall::close(0);
|
||||
|
||||
let _ = syscall::open(&tty, syscall::flag::O_RDWR);
|
||||
let _ = syscall::open(&tty, syscall::flag::O_RDWR);
|
||||
let _ = syscall::open(&tty, syscall::flag::O_RDWR);
|
||||
if let Err(err) = set_tty(&tty) {
|
||||
writeln!(io::stderr(), "getty: failed to open TTY {}: {}", tty, err).unwrap();
|
||||
process::exit(1);
|
||||
}
|
||||
|
||||
env::set_var("TTY", &tty);
|
||||
{
|
||||
@@ -44,19 +74,7 @@ pub fn main() {
|
||||
}
|
||||
|
||||
if unsafe { syscall::clone(0).unwrap() } == 0 {
|
||||
loop {
|
||||
if clear {
|
||||
syscall::write(1, b"\x1Bc").unwrap();
|
||||
}
|
||||
syscall::fsync(1).unwrap();
|
||||
match Command::new("login").spawn() {
|
||||
Ok(mut child) => match child.wait() {
|
||||
Ok(_status) => (), //println!("getty: waited for login: {:?}", status.code()),
|
||||
Err(err) => panic!("getty: failed to wait for login: {}", err)
|
||||
},
|
||||
Err(err) => panic!("getty: failed to execute login: {}", err)
|
||||
}
|
||||
}
|
||||
daemon();
|
||||
}
|
||||
} else {
|
||||
panic!("getty: no tty provided");
|
||||
|
||||
Reference in New Issue
Block a user