Skip to content
Snippets Groups Projects
Commit 3ad66c8a authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Correctly wait on shell

parent 6f44e698
No related branches found
No related tags found
No related merge requests found
...@@ -42,68 +42,70 @@ fn main() { ...@@ -42,68 +42,70 @@ fn main() {
.stderr(Stdio::from_raw_fd(slave_stderr.into_raw_fd())) .stderr(Stdio::from_raw_fd(slave_stderr.into_raw_fd()))
.spawn() .spawn()
} { } {
Ok(_process) => { Ok(mut process) => {
let mut console = Console::new(width, height); {
let mut console = Console::new(width, height);
let mut event_file = File::open("event:").expect("terminal: failed to open event file");
let mut event_file = File::open("event:").expect("terminal: failed to open event file");
let window_fd = console.window.as_raw_fd();
syscall::fevent(window_fd, syscall::flag::EVENT_READ).expect("terminal: failed to fevent console window"); let window_fd = console.window.as_raw_fd();
syscall::fevent(window_fd, syscall::flag::EVENT_READ).expect("terminal: failed to fevent console window");
let mut master = unsafe { File::from_raw_fd(master_fd) };
syscall::fevent(master_fd, syscall::flag::EVENT_READ).expect("terminal: failed to fevent master PTY");
let mut handle_event = |event_id: usize, event_count: usize| -> bool {
if event_id == window_fd {
for event in console.window.events() {
if event.code == event::EVENT_QUIT {
return false;
}
let mut master = unsafe { File::from_raw_fd(master_fd) }; if let Some(line) = console.event(event) {
syscall::fevent(master_fd, syscall::flag::EVENT_READ).expect("terminal: failed to fevent master PTY"); if let Err(err) = master.write(&line.as_bytes()) {
let term_stderr = io::stderr();
let mut term_stderr = term_stderr.lock();
let mut handle_event = |event_id: usize, event_count: usize| -> bool { let _ = term_stderr.write(b"failed to write stdin: ");
if event_id == window_fd { let _ = term_stderr.write(err.description().as_bytes());
for event in console.window.events() { let _ = term_stderr.write(b"\n");
if event.code == event::EVENT_QUIT { return false;
println!("window quit"); }
return false; }
} }
} else if event_id == master_fd {
if let Some(line) = console.event(event) { let mut packet = [0; 4096];
if let Err(err) = master.write(&line.as_bytes()) { let count = master.read(&mut packet).expect("terminal: failed to read master PTY");
let term_stderr = io::stderr(); if count == 0 {
let mut term_stderr = term_stderr.lock(); if event_count == 0 {
let _ = term_stderr.write(b"failed to write stdin: ");
let _ = term_stderr.write(err.description().as_bytes());
let _ = term_stderr.write(b"\n");
return false; return false;
} }
} } else {
} if packet[0] & 1 == 1 {
} else if event_id == master_fd { console.inner.redraw = true;
let mut packet = [0; 4096]; }
let count = master.read(&mut packet).expect("terminal: failed to read master PTY"); console.write(&packet[1..count])
if count == 0 {
if event_count == 0 {
return false;
} }
} else { } else {
if packet[0] & 1 == 1 { println!("Unknown event {}", event_id);
console.inner.redraw = true;
}
console.write(&packet[1..count])
} }
} else {
println!("Unknown event {}", event_id);
}
true true
}; };
handle_event(window_fd, 0); handle_event(window_fd, 0);
handle_event(master_fd, 0); handle_event(master_fd, 0);
'events: loop { 'events: loop {
let mut sys_event = syscall::Event::default(); let mut sys_event = syscall::Event::default();
event_file.read(&mut sys_event).expect("terminal: failed to read event file"); event_file.read(&mut sys_event).expect("terminal: failed to read event file");
if ! handle_event(sys_event.id, sys_event.data) { if ! handle_event(sys_event.id, sys_event.data) {
break 'events; break 'events;
}
} }
println!("handled");
} }
process.wait().expect("terminal: failed to wait on shell");
}, },
Err(err) => { Err(err) => {
let term_stderr = io::stderr(); let term_stderr = io::stderr();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment