open Unix;;
let mon_exec cmd args =
  execvp cmd (Array.append [|cmd|] args);
  assert false;;
let command_fg_redirect cmd args redirections =
  let make_redirect rd =
    match rd with
      In_to_file file ->
        let desc_file = openfile file [O_RDONLY] 0o666 in
        dup2 desc_file stdin;
        close desc_file
    | Out_to_file file ->
        let desc_file = openfile file [O_WRONLY;O_CREAT;O_TRUNC] 0o666 in
        dup2 desc_file stdout;
        close desc_file
    | Err_to_file file  ->
        let desc_file = openfile file [O_WRONLY;O_CREAT;O_TRUNC] 0o666 in
        dup2 desc_file stderr;
        close desc_file
    | Out_append_file file ->
        let desc_file = openfile file [O_WRONLY;O_APPEND;O_CREAT] 0o666 in
        dup2 desc_file stdout;
        close desc_file
    | Err_to_out -> dup2 stdout stderr in
  match fork () with
    0 ->
      List.iter make_redirect redirections;
      mon_exec cmd args
  | pid -> snd (waitpid [] pid);;