|
|
@@ -1,13 +1,12 @@
|
|
1
|
1
|
extern crate nix;
|
|
2
|
2
|
|
|
3
|
3
|
use std::io::{BufRead, Write};
|
|
4
|
|
-use std::str::{FromStr, Split};
|
|
|
4
|
+use std::str::FromStr;
|
|
5
|
5
|
use std::env;
|
|
6
|
|
-use std::os::unix::io::RawFd;
|
|
7
|
6
|
use std::ffi::{OsString, CString};
|
|
8
|
7
|
use nix::unistd::ForkResult::{Child, Parent};
|
|
9
|
|
-use nix::sys::wait::{wait, waitpid, WaitStatus};
|
|
10
|
|
-use nix::unistd::{dup2, close, execvp, fork, pipe, read, write};
|
|
|
8
|
+use nix::sys::wait::wait;
|
|
|
9
|
+use nix::unistd::{dup2, close, execvp, fork, pipe};
|
|
11
|
10
|
|
|
12
|
11
|
mod errortype;
|
|
13
|
12
|
|
|
|
@@ -136,25 +135,24 @@ impl<R: BufRead, W: Write> Shell<R, W> {
|
|
136
|
135
|
Command::Empty => {},
|
|
137
|
136
|
Command::Program(cmd) => {
|
|
138
|
137
|
|
|
139
|
|
- let mut commands = cmd.split('|');
|
|
|
138
|
+ let commands = cmd.split('|');
|
|
140
|
139
|
let commands_vec: Vec<&str> = commands.collect();
|
|
141
|
|
-
|
|
142
|
|
- let needs_pipe = commands_vec.len() == 2;
|
|
143
|
140
|
|
|
|
141
|
+ let needs_pipe = commands_vec.len() == 2;
|
|
144
|
142
|
|
|
145
|
143
|
|
|
146
|
144
|
let fi = fork();
|
|
147
|
145
|
match fi {
|
|
148
|
|
- Ok(Parent { child }) => {
|
|
149
|
|
- wait();
|
|
|
146
|
+ Ok(Parent { child: _child }) => {
|
|
|
147
|
+ let _ = wait();
|
|
150
|
148
|
|
|
151
|
149
|
}
|
|
152
|
150
|
Ok(Child) => {
|
|
153
|
151
|
if let Ok((reader, writer)) = pipe() {
|
|
154
|
152
|
let sec = fork();
|
|
155
|
153
|
match sec {
|
|
156
|
|
- Ok(Parent { child }) => {
|
|
157
|
|
- wait();
|
|
|
154
|
+ Ok(Parent { child: _child }) => {
|
|
|
155
|
+ let _ = wait();
|
|
158
|
156
|
if let Some(second) = commands_vec.get(1) {
|
|
159
|
157
|
match close(writer) {
|
|
160
|
158
|
Ok(_) => {},
|
|
|
@@ -190,7 +188,7 @@ impl<R: BufRead, W: Write> Shell<R, W> {
|
|
190
|
188
|
}
|
|
191
|
189
|
|
|
192
|
190
|
fn execute(&self, cmd: &str){
|
|
193
|
|
- let mut parts:Vec<&str> = cmd.split_whitespace().collect();
|
|
|
191
|
+ let parts:Vec<&str> = cmd.split_whitespace().collect();
|
|
194
|
192
|
let args:Vec<CString> = parts.iter().map(|f| CString::new(*f).unwrap()).collect();
|
|
195
|
193
|
let t = args.into_boxed_slice();
|
|
196
|
194
|
|