@@ -13,10 +13,7 @@ use devices::virtio::CacheType;
13
13
use env_logger:: { Env , Target } ;
14
14
#[ cfg( feature = "gpu" ) ]
15
15
use krun_display:: DisplayBackend ;
16
- use libc:: c_char;
17
- #[ cfg( feature = "net" ) ]
18
- use libc:: c_int;
19
- use libc:: size_t;
16
+ use libc:: { c_char, c_int, size_t} ;
20
17
use once_cell:: sync:: Lazy ;
21
18
use polly:: event_manager:: EventManager ;
22
19
#[ cfg( all( feature = "blk" , not( feature = "tee" ) ) ) ]
@@ -29,16 +26,20 @@ use std::env;
29
26
use std:: ffi:: CString ;
30
27
use std:: ffi:: { c_void, CStr } ;
31
28
use std:: fs:: File ;
29
+ use std:: io:: IsTerminal ;
32
30
#[ cfg( target_os = "linux" ) ]
33
31
use std:: os:: fd:: AsRawFd ;
34
- use std:: os:: fd:: { FromRawFd , RawFd } ;
32
+ use std:: os:: fd:: { BorrowedFd , FromRawFd , RawFd } ;
35
33
use std:: path:: PathBuf ;
36
34
use std:: slice;
37
35
use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
38
36
use std:: sync:: LazyLock ;
39
37
use std:: sync:: Mutex ;
40
38
use utils:: eventfd:: EventFd ;
41
- use vmm:: resources:: { DefaultVirtioConsoleConfig , SerialConsoleConfig , VmResources } ;
39
+ use vmm:: resources:: {
40
+ DefaultVirtioConsoleConfig , PortConfig , SerialConsoleConfig , VirtioConsoleConfigMode ,
41
+ VmResources ,
42
+ } ;
42
43
#[ cfg( feature = "blk" ) ]
43
44
use vmm:: vmm_config:: block:: { BlockDeviceConfig , BlockRootConfig } ;
44
45
#[ cfg( not( feature = "tee" ) ) ]
@@ -2118,24 +2119,128 @@ pub unsafe extern "C" fn krun_add_virtio_console_default(
2118
2119
Entry :: Occupied ( mut ctx_cfg) => {
2119
2120
let cfg = ctx_cfg. get_mut ( ) ;
2120
2121
2121
- cfg. vmr . virtio_consoles . push ( DefaultVirtioConsoleConfig {
2122
- input_fd,
2123
- output_fd,
2124
- err_fd,
2125
- } ) ;
2122
+ cfg. vmr
2123
+ . virtio_consoles
2124
+ . push ( VirtioConsoleConfigMode :: Autoconfigure (
2125
+ DefaultVirtioConsoleConfig {
2126
+ input_fd,
2127
+ output_fd,
2128
+ err_fd,
2129
+ } ,
2130
+ ) ) ;
2126
2131
}
2127
2132
Entry :: Vacant ( _) => return -libc:: ENOENT ,
2128
2133
}
2129
2134
2130
2135
KRUN_SUCCESS
2131
2136
}
2132
2137
2138
+ #[ allow( clippy:: missing_safety_doc) ]
2139
+ #[ no_mangle]
2140
+ pub unsafe extern "C" fn krun_add_virtio_console_multiport ( ctx_id : u32 ) -> i32 {
2141
+ match CTX_MAP . lock ( ) . unwrap ( ) . entry ( ctx_id) {
2142
+ Entry :: Occupied ( mut ctx_cfg) => {
2143
+ let cfg = ctx_cfg. get_mut ( ) ;
2144
+ let console_id = cfg. vmr . virtio_consoles . len ( ) as i32 ;
2145
+
2146
+ cfg. vmr
2147
+ . virtio_consoles
2148
+ . push ( VirtioConsoleConfigMode :: Explicit ( Vec :: new ( ) ) ) ;
2149
+
2150
+ console_id
2151
+ }
2152
+ Entry :: Vacant ( _) => -libc:: ENOENT ,
2153
+ }
2154
+ }
2155
+
2156
+ #[ allow( clippy:: missing_safety_doc) ]
2157
+ #[ no_mangle]
2158
+ pub unsafe extern "C" fn krun_add_console_port_tty (
2159
+ ctx_id : u32 ,
2160
+ console_id : u32 ,
2161
+ name : * const libc:: c_char ,
2162
+ tty_fd : libc:: c_int ,
2163
+ ) -> i32 {
2164
+ if tty_fd < 0 {
2165
+ return -libc:: EINVAL ;
2166
+ }
2167
+
2168
+ let name_str = if name. is_null ( ) {
2169
+ String :: new ( )
2170
+ } else {
2171
+ match CStr :: from_ptr ( name) . to_str ( ) {
2172
+ Ok ( s) => s. to_string ( ) ,
2173
+ Err ( _) => return -libc:: EINVAL ,
2174
+ }
2175
+ } ;
2176
+
2177
+ if !BorrowedFd :: borrow_raw ( tty_fd) . is_terminal ( ) {
2178
+ return -libc:: ENOTTY ;
2179
+ }
2180
+
2181
+ match CTX_MAP . lock ( ) . unwrap ( ) . entry ( ctx_id) {
2182
+ Entry :: Occupied ( mut ctx_cfg) => {
2183
+ let cfg = ctx_cfg. get_mut ( ) ;
2184
+
2185
+ match cfg. vmr . virtio_consoles . get_mut ( console_id as usize ) {
2186
+ Some ( VirtioConsoleConfigMode :: Explicit ( ports) ) => {
2187
+ ports. push ( PortConfig :: Tty {
2188
+ name : name_str,
2189
+ tty_fd,
2190
+ } ) ;
2191
+ KRUN_SUCCESS
2192
+ }
2193
+ _ => -libc:: EINVAL ,
2194
+ }
2195
+ }
2196
+ Entry :: Vacant ( _) => -libc:: ENOENT ,
2197
+ }
2198
+ }
2199
+
2200
+ #[ allow( clippy:: missing_safety_doc) ]
2201
+ #[ no_mangle]
2202
+ pub unsafe extern "C" fn krun_add_console_port_inout (
2203
+ ctx_id : u32 ,
2204
+ console_id : u32 ,
2205
+ name : * const c_char ,
2206
+ input_fd : c_int ,
2207
+ output_fd : c_int ,
2208
+ ) -> i32 {
2209
+ let name_str = if name. is_null ( ) {
2210
+ String :: new ( )
2211
+ } else {
2212
+ match CStr :: from_ptr ( name) . to_str ( ) {
2213
+ Ok ( s) => s. to_string ( ) ,
2214
+ Err ( _) => return -libc:: EINVAL ,
2215
+ }
2216
+ } ;
2217
+
2218
+ match CTX_MAP . lock ( ) . unwrap ( ) . entry ( ctx_id) {
2219
+ Entry :: Occupied ( mut ctx_cfg) => {
2220
+ let cfg = ctx_cfg. get_mut ( ) ;
2221
+
2222
+ match cfg. vmr . virtio_consoles . get_mut ( console_id as usize ) {
2223
+ Some ( VirtioConsoleConfigMode :: Explicit ( ports) ) => {
2224
+ ports. push ( PortConfig :: InOut {
2225
+ name : name_str,
2226
+ input_fd,
2227
+ output_fd,
2228
+ } ) ;
2229
+ KRUN_SUCCESS
2230
+ }
2231
+ _ => -libc:: EINVAL ,
2232
+ }
2233
+ }
2234
+ Entry :: Vacant ( _) => -libc:: ENOENT ,
2235
+ }
2236
+ }
2237
+
2133
2238
#[ allow( clippy:: missing_safety_doc) ]
2134
2239
#[ no_mangle]
2135
2240
pub unsafe extern "C" fn krun_add_serial_console_default (
2136
2241
ctx_id : u32 ,
2137
- input_fd : libc :: c_int ,
2138
- output_fd : libc :: c_int ,
2242
+ input_fd : c_int ,
2243
+ output_fd : c_int ,
2139
2244
) -> i32 {
2140
2245
match CTX_MAP . lock ( ) . unwrap ( ) . entry ( ctx_id) {
2141
2246
Entry :: Occupied ( mut ctx_cfg) => {
0 commit comments