@@ -23,15 +23,18 @@ use std::{
2323 fs:: File ,
2424 io:: { prelude:: * , BufReader } ,
2525 mem:: ManuallyDrop ,
26- os:: {
27- fd:: AsRawFd ,
28- raw:: { c_char, c_void} ,
29- } ,
26+ os:: raw:: { c_char, c_void} ,
3027 path:: { Path , PathBuf } ,
3128 str:: FromStr ,
3229 time:: { Duration , SystemTime } ,
3330} ;
3431
32+ #[ cfg( any( unix) ) ]
33+ use std:: os:: fd:: AsRawFd ;
34+
35+ #[ cfg( any( windows) ) ]
36+ use std:: os:: windows:: io:: { AsRawHandle , RawHandle } ;
37+
3538use crate :: codesign:: Verifier ;
3639use flate2:: read:: GzDecoder ;
3740use hex;
@@ -647,16 +650,29 @@ pub unsafe extern "C" fn cvd_verify(
647650) -> bool {
648651 let mut cvd = ManuallyDrop :: new ( Box :: from_raw ( cvd as * mut CVD ) ) ;
649652
650- let verifier = ManuallyDrop :: new ( Box :: from_raw ( verifier_ptr as * mut Verifier ) ) ;
651-
652- match cvd. verify ( Some ( & verifier) , disable_md5) {
653- Ok ( signer) => {
654- let signer_cstr = std:: ffi:: CString :: new ( signer) . unwrap ( ) ;
655- * signer_name = signer_cstr. into_raw ( ) ;
656- true
653+ if verifier_ptr. is_null ( ) {
654+ match cvd. verify ( None , disable_md5) {
655+ Ok ( signer) => {
656+ let signer_cstr = std:: ffi:: CString :: new ( signer) . unwrap ( ) ;
657+ * signer_name = signer_cstr. into_raw ( ) ;
658+ true
659+ }
660+ Err ( e) => {
661+ ffi_error ! ( err = err, e)
662+ }
657663 }
658- Err ( e) => {
659- ffi_error ! ( err = err, e)
664+ } else {
665+ let verifier = ManuallyDrop :: new ( Box :: from_raw ( verifier_ptr as * mut Verifier ) ) ;
666+
667+ match cvd. verify ( Some ( & verifier) , disable_md5) {
668+ Ok ( signer) => {
669+ let signer_cstr = std:: ffi:: CString :: new ( signer) . unwrap ( ) ;
670+ * signer_name = signer_cstr. into_raw ( ) ;
671+ true
672+ }
673+ Err ( e) => {
674+ ffi_error ! ( err = err, e)
675+ }
660676 }
661677 }
662678}
@@ -778,8 +794,29 @@ pub unsafe extern "C" fn cvd_get_builder(cvd: *const c_void) -> *mut c_char {
778794///
779795/// No parameters may be NULL
780796/// The CVD pointer must be valid
797+ #[ cfg( any( unix) ) ]
781798#[ export_name = "cvd_get_file" ]
782799pub unsafe extern "C" fn cvd_get_file ( cvd : * const c_void ) -> i32 {
783800 let cvd = ManuallyDrop :: new ( Box :: from_raw ( cvd as * mut CVD ) ) ;
801+
784802 cvd. file . as_raw_fd ( )
785803}
804+
805+ /// C interface for getting the file handle of a CVD.
806+ /// Handles all the unsafe ffi stuff.
807+ /// Returns the file handle an integer.
808+ /// The caller must not close the file handle.
809+ /// The file handle is not guaranteed to be valid after the CVD struct is freed.
810+ ///
811+ /// # Safety
812+ ///
813+ /// No parameters may be NULL
814+ /// The CVD pointer must be valid
815+ #[ cfg( any( windows) ) ]
816+ #[ export_name = "cvd_get_file" ]
817+ pub unsafe extern "C" fn cvd_get_file ( cvd : * const c_void ) -> i32 {
818+ let cvd = ManuallyDrop :: new ( Box :: from_raw ( cvd as * mut CVD ) ) ;
819+
820+ let file = cvd. file . as_raw_handle ( ) ;
821+ file. to_fd ( )
822+ }
0 commit comments