1- use log:: { error, info} ;
1+ use log:: { error, info, debug } ;
22
33use memflow:: cglue;
44use memflow:: connector:: cpu_state:: * ;
@@ -31,15 +31,23 @@ impl<P: MemoryView + Process> QemuProcfs<P> {
3131 pub fn new < O : Os < IntoProcessType = P > > (
3232 mut os : O ,
3333 map_override : Option < CTup2 < Address , umem > > ,
34+ qemu_binary_name : Option < String > ,
3435 ) -> Result < Self > {
3536 let mut proc = None ;
3637
3738 let callback = & mut |info : ProcessInfo | {
38- if proc. is_none ( ) && is_qemu ( & info) {
39+
40+ let matches = qemu_binary_name
41+ . as_ref ( )
42+ . map ( |nm| & * info. name == nm)
43+ . unwrap_or_else ( || is_qemu ( & info) ) ;
44+ if proc. is_none ( ) && matches {
45+ debug ! ( "Found QEMU process: {:#?}" , info) ;
3946 proc = Some ( info) ;
4047 }
41-
48+
4249 proc. is_none ( )
50+
4351 } ;
4452
4553 os. process_info_list_callback ( callback. into ( ) ) ?;
@@ -58,15 +66,21 @@ impl<P: MemoryView + Process> QemuProcfs<P> {
5866 mut os : O ,
5967 name : & str ,
6068 map_override : Option < CTup2 < Address , umem > > ,
69+ qemu_binary_name : Option < String > ,
6170 ) -> Result < Self > {
6271 let mut proc = None ;
6372
6473 let callback = & mut |info : ProcessInfo | {
74+ let matches = qemu_binary_name
75+ . as_ref ( )
76+ . map ( |nm| & * info. name == nm)
77+ . unwrap_or_else ( || is_qemu ( & info) ) ;
6578 if proc. is_none ( )
66- && is_qemu ( & info )
79+ && matches
6780 && qemu_arg_opt ( info. command_line . split_whitespace ( ) , "-name" , "guest" ) . as_deref ( )
6881 == Some ( name)
6982 {
83+ debug ! ( "Found QEMU process with guest name '{}': {:#?}" , name, info) ;
7084 proc = Some ( info) ;
7185 }
7286
@@ -202,6 +216,7 @@ fn validator() -> ArgsValidator {
202216 ArgsValidator :: new ( )
203217 . arg ( ArgDescriptor :: new ( "map_base" ) . description ( "override of VM memory base" ) )
204218 . arg ( ArgDescriptor :: new ( "map_size" ) . description ( "override of VM memory size" ) )
219+ . arg ( ArgDescriptor :: new ( "qemu_binary_name" ) . description ( "override default QEMU binary name" ) )
205220}
206221
207222/// Creates a new Qemu Procfs instance.
@@ -262,15 +277,20 @@ pub fn create_connector_with_os<O: Os>(
262277 . and_then ( |size| umem:: from_str_radix ( size, 16 ) . ok ( ) ) ,
263278 )
264279 . map ( |( start, size) | CTup2 ( Address :: from ( start) , size) ) ;
280+
281+ let qemu_binary_name_override = args
282+ . get ( "qemu_binary_name" )
283+ . map ( |s| s. to_string ( ) ) ;
284+
265285
266286 if let Some ( name) = name. or_else ( || args. get ( "name" ) ) {
267287 if let Ok ( pid) = Pid :: from_str_radix ( name, 10 ) {
268288 QemuProcfs :: with_pid ( os, pid, map_override)
269289 } else {
270- QemuProcfs :: with_guest_name ( os, name, map_override)
290+ QemuProcfs :: with_guest_name ( os, name, map_override, qemu_binary_name_override )
271291 }
272292 } else {
273- QemuProcfs :: new ( os, map_override)
293+ QemuProcfs :: new ( os, map_override, qemu_binary_name_override )
274294 }
275295 }
276296 Err ( err) => {
0 commit comments