@@ -52,7 +52,7 @@ use crate::device_manager;
52
52
use crate :: signal_handler:: register_sigint_handler;
53
53
#[ cfg( target_os = "linux" ) ]
54
54
use crate :: signal_handler:: register_sigwinch_handler;
55
- use crate :: terminal:: term_set_raw_mode;
55
+ use crate :: terminal:: { term_restore_mode , term_set_raw_mode} ;
56
56
#[ cfg( feature = "blk" ) ]
57
57
use crate :: vmm_config:: block:: BlockBuilder ;
58
58
#[ cfg( not( any( feature = "tee" , feature = "nitro" ) ) ) ]
@@ -1892,64 +1892,70 @@ fn attach_console_devices(
1892
1892
Some ( c) => ( c. input_fd , c. output_fd , c. err_fd ) ,
1893
1893
None => ( STDIN_FILENO , STDOUT_FILENO , STDERR_FILENO ) ,
1894
1894
} ;
1895
- let stdin_is_terminal =
1896
- isatty ( unsafe { BorrowedFd :: borrow_raw ( input_fd) } ) . unwrap_or ( false ) ;
1897
- let stdout_is_terminal =
1898
- isatty ( unsafe { BorrowedFd :: borrow_raw ( output_fd) } ) . unwrap_or ( false ) ;
1899
- let stderr_is_terminal = isatty ( unsafe { BorrowedFd :: borrow_raw ( err_fd) } ) . unwrap_or ( false ) ;
1900
-
1901
- if let Err ( e) = term_set_raw_mode ( !stdin_is_terminal) {
1902
- log:: error!( "Failed to set terminal to raw mode: {e}" )
1903
- }
1895
+ let input_is_terminal =
1896
+ input_fd >= 0 && isatty ( unsafe { BorrowedFd :: borrow_raw ( input_fd) } ) . unwrap_or ( false ) ;
1897
+ let output_is_terminal =
1898
+ output_fd >= 0 && isatty ( unsafe { BorrowedFd :: borrow_raw ( output_fd) } ) . unwrap_or ( false ) ;
1899
+ let error_is_terminal =
1900
+ err_fd >= 0 && isatty ( unsafe { BorrowedFd :: borrow_raw ( err_fd) } ) . unwrap_or ( false ) ;
1901
+
1902
+ let term_fd = if input_is_terminal {
1903
+ Some ( unsafe { BorrowedFd :: borrow_raw ( input_fd) } )
1904
+ } else if output_is_terminal {
1905
+ Some ( unsafe { BorrowedFd :: borrow_raw ( output_fd) } )
1906
+ } else if error_is_terminal {
1907
+ Some ( unsafe { BorrowedFd :: borrow_raw ( err_fd) } )
1908
+ } else {
1909
+ None
1910
+ } ;
1904
1911
1905
- let console_input = if stdin_is_terminal {
1906
- Some ( port_io:: stdin ( ) . unwrap ( ) )
1907
- } else if input_fd < 0 {
1908
- Some ( port_io:: input_empty ( ) . unwrap ( ) )
1909
- } else if input_fd != STDIN_FILENO {
1912
+ let forwarding_sigint;
1913
+ let console_input = if input_is_terminal && input_fd >= 0 {
1914
+ forwarding_sigint = false ;
1910
1915
Some ( port_io:: input_to_raw_fd_dup ( input_fd) . unwrap ( ) )
1911
1916
} else {
1912
1917
#[ cfg( target_os = "linux" ) ]
1913
1918
{
1919
+ forwarding_sigint = true ;
1914
1920
let sigint_input = port_io:: PortInputSigInt :: new ( ) ;
1915
1921
let sigint_input_fd = sigint_input. sigint_evt ( ) . as_raw_fd ( ) ;
1916
1922
register_sigint_handler ( sigint_input_fd) . map_err ( RegisterFsSigwinch ) ?;
1917
1923
Some ( Box :: new ( sigint_input) as _ )
1918
1924
}
1919
1925
#[ cfg( not( target_os = "linux" ) ) ]
1920
- Some ( port_io:: input_empty ( ) . unwrap ( ) )
1926
+ {
1927
+ forwarding_sigint = false ;
1928
+ Some ( port_io:: input_empty ( ) . unwrap ( ) )
1929
+ }
1921
1930
} ;
1922
1931
1923
- let console_output = if stdout_is_terminal {
1924
- Some ( port_io:: stdout ( ) . unwrap ( ) )
1925
- } else if output_fd != STDOUT_FILENO && output_fd > 0 {
1932
+ let console_output = if output_is_terminal && output_fd >= 0 {
1926
1933
Some ( port_io:: output_to_raw_fd_dup ( output_fd) . unwrap ( ) )
1927
1934
} else {
1928
1935
Some ( port_io:: output_to_log_as_err ( ) )
1929
1936
} ;
1930
1937
1931
1938
let mut ports = vec ! [ PortDescription :: console( console_input, console_output) ] ;
1932
1939
1933
- let console_err = if stderr_is_terminal {
1934
- Some ( port_io:: stderr ( ) . unwrap ( ) )
1935
- } else if err_fd != STDERR_FILENO && err_fd > 0 {
1936
- Some ( port_io:: output_to_raw_fd_dup ( err_fd) . unwrap ( ) )
1937
- } else {
1938
- None
1939
- } ;
1940
-
1941
- ports. push ( PortDescription :: console ( None , console_err) ) ;
1942
-
1943
- if !stdin_is_terminal && input_fd == STDIN_FILENO {
1944
- ports. push ( PortDescription :: input_pipe ( "krun-stdin" , port_io:: stdin ( ) . unwrap ( ) ) ) ;
1940
+ if input_fd >= 0 && !input_is_terminal {
1941
+ ports. push ( PortDescription :: input_pipe (
1942
+ "krun-stdin" ,
1943
+ port_io:: input_to_raw_fd_dup ( input_fd) . unwrap ( ) ,
1944
+ ) ) ;
1945
1945
}
1946
1946
1947
- if !stdout_is_terminal && output_fd == STDOUT_FILENO {
1948
- ports. push ( PortDescription :: output_pipe ( "krun-stdout" , port_io:: stdout ( ) . unwrap ( ) ) ) ;
1947
+ if output_fd >= 0 && !output_is_terminal {
1948
+ ports. push ( PortDescription :: output_pipe (
1949
+ "krun-stdout" ,
1950
+ port_io:: output_to_raw_fd_dup ( output_fd) . unwrap ( ) ,
1951
+ ) ) ;
1949
1952
} ;
1950
1953
1951
- if !stderr_is_terminal && err_fd == STDERR_FILENO {
1952
- ports. push ( PortDescription :: output_pipe ( "krun-stderr" , port_io:: stderr ( ) . unwrap ( ) ) ) ;
1954
+ if err_fd >= 0 && !error_is_terminal {
1955
+ ports. push ( PortDescription :: output_pipe (
1956
+ "krun-stderr" ,
1957
+ port_io:: output_to_raw_fd_dup ( err_fd) . unwrap ( ) ,
1958
+ ) ) ;
1953
1959
}
1954
1960
1955
1961
ports
0 commit comments