xref: /aosp_15_r20/system/apex/libs/libapexsupport/src/lib.rs (revision 33f3758387333dbd2962d7edbd98681940d895da)
1*33f37583SAndroid Build Coastguard Worker /*
2*33f37583SAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*33f37583SAndroid Build Coastguard Worker  *
4*33f37583SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*33f37583SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*33f37583SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*33f37583SAndroid Build Coastguard Worker  *
8*33f37583SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*33f37583SAndroid Build Coastguard Worker  *
10*33f37583SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*33f37583SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*33f37583SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33f37583SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*33f37583SAndroid Build Coastguard Worker  * limitations under the License.
15*33f37583SAndroid Build Coastguard Worker  */
16*33f37583SAndroid Build Coastguard Worker 
17*33f37583SAndroid Build Coastguard Worker //! A FFI wrapper for APEX support library
18*33f37583SAndroid Build Coastguard Worker 
19*33f37583SAndroid Build Coastguard Worker mod apexinfo;
20*33f37583SAndroid Build Coastguard Worker 
21*33f37583SAndroid Build Coastguard Worker use apexinfo::{AApexInfo, AApexInfoError};
22*33f37583SAndroid Build Coastguard Worker use std::ffi::c_char;
23*33f37583SAndroid Build Coastguard Worker 
24*33f37583SAndroid Build Coastguard Worker /// NOTE: Keep these constants in sync with apexsupport.h
25*33f37583SAndroid Build Coastguard Worker const AAPEXINFO_OK: i32 = 0;
26*33f37583SAndroid Build Coastguard Worker const AAPEXINFO_NO_APEX: i32 = 1;
27*33f37583SAndroid Build Coastguard Worker const AAPEXINFO_ERROR_GET_EXECUTABLE_PATH: i32 = 2;
28*33f37583SAndroid Build Coastguard Worker const AAPEXINFO_INALID_APEX: i32 = 3;
29*33f37583SAndroid Build Coastguard Worker 
as_error_code(err: &AApexInfoError) -> i3230*33f37583SAndroid Build Coastguard Worker fn as_error_code(err: &AApexInfoError) -> i32 {
31*33f37583SAndroid Build Coastguard Worker     match err {
32*33f37583SAndroid Build Coastguard Worker         AApexInfoError::PathNotFromApex(_) => AAPEXINFO_NO_APEX,
33*33f37583SAndroid Build Coastguard Worker         AApexInfoError::ExePathUnavailable(_) => AAPEXINFO_ERROR_GET_EXECUTABLE_PATH,
34*33f37583SAndroid Build Coastguard Worker         AApexInfoError::InvalidApex(_) => AAPEXINFO_INALID_APEX,
35*33f37583SAndroid Build Coastguard Worker     }
36*33f37583SAndroid Build Coastguard Worker }
37*33f37583SAndroid Build Coastguard Worker 
38*33f37583SAndroid Build Coastguard Worker #[no_mangle]
39*33f37583SAndroid Build Coastguard Worker /// Creates AApexInfo object when called by the executable from an APEX
40*33f37583SAndroid Build Coastguard Worker ///
41*33f37583SAndroid Build Coastguard Worker /// # Safety
42*33f37583SAndroid Build Coastguard Worker ///
43*33f37583SAndroid Build Coastguard Worker /// The provided pointer must be valid and have no aliases for the duration of the call.
AApexInfo_create(out: *mut *mut AApexInfo) -> i3244*33f37583SAndroid Build Coastguard Worker pub unsafe extern "C" fn AApexInfo_create(out: *mut *mut AApexInfo) -> i32 {
45*33f37583SAndroid Build Coastguard Worker     match AApexInfo::create() {
46*33f37583SAndroid Build Coastguard Worker         Ok(info) => {
47*33f37583SAndroid Build Coastguard Worker             let ptr = Box::into_raw(Box::new(info));
48*33f37583SAndroid Build Coastguard Worker             // SAFETY: We have checked that `out` is not null, so the caller guarantees that it is
49*33f37583SAndroid Build Coastguard Worker             // valid and unaliased.
50*33f37583SAndroid Build Coastguard Worker             unsafe { *out = ptr };
51*33f37583SAndroid Build Coastguard Worker             AAPEXINFO_OK
52*33f37583SAndroid Build Coastguard Worker         }
53*33f37583SAndroid Build Coastguard Worker         Err(err) => {
54*33f37583SAndroid Build Coastguard Worker             // TODO(b/271488212): Use Rust logger.
55*33f37583SAndroid Build Coastguard Worker             eprintln!("AApexInfo_create(): {err:?}");
56*33f37583SAndroid Build Coastguard Worker             as_error_code(&err)
57*33f37583SAndroid Build Coastguard Worker         }
58*33f37583SAndroid Build Coastguard Worker     }
59*33f37583SAndroid Build Coastguard Worker }
60*33f37583SAndroid Build Coastguard Worker 
61*33f37583SAndroid Build Coastguard Worker #[no_mangle]
62*33f37583SAndroid Build Coastguard Worker /// Destroys AApexInfo object created by AApexInfo_create().
63*33f37583SAndroid Build Coastguard Worker ///
64*33f37583SAndroid Build Coastguard Worker /// # Safety
65*33f37583SAndroid Build Coastguard Worker ///
66*33f37583SAndroid Build Coastguard Worker /// The provided pointer must point to a valid object previously allocated by
67*33f37583SAndroid Build Coastguard Worker /// `AApexInfo_create` (and not yet destroyed).
AApexInfo_destroy(info: *mut AApexInfo)68*33f37583SAndroid Build Coastguard Worker pub unsafe extern "C" fn AApexInfo_destroy(info: *mut AApexInfo) {
69*33f37583SAndroid Build Coastguard Worker     // SAFETY: The pointer is not null, so the caller guarantees that it was previously returned by
70*33f37583SAndroid Build Coastguard Worker     // AApexInfo_create. AApexInfo_create got the pointer from `Box::into_raw`, so converting it
71*33f37583SAndroid Build Coastguard Worker     // back with `Box::from_raw` is valid.
72*33f37583SAndroid Build Coastguard Worker     unsafe { drop(Box::from_raw(info)) };
73*33f37583SAndroid Build Coastguard Worker }
74*33f37583SAndroid Build Coastguard Worker 
75*33f37583SAndroid Build Coastguard Worker #[no_mangle]
76*33f37583SAndroid Build Coastguard Worker /// Returns a C-string for APEX name.
77*33f37583SAndroid Build Coastguard Worker ///
78*33f37583SAndroid Build Coastguard Worker /// # Safety
79*33f37583SAndroid Build Coastguard Worker ///
80*33f37583SAndroid Build Coastguard Worker /// The provided pointer must point to a valid object.
AApexInfo_getName(info: *const AApexInfo) -> *const c_char81*33f37583SAndroid Build Coastguard Worker pub unsafe extern "C" fn AApexInfo_getName(info: *const AApexInfo) -> *const c_char {
82*33f37583SAndroid Build Coastguard Worker     // SAFETY: The pointer is not null, so the caller guarantees that it is valid.
83*33f37583SAndroid Build Coastguard Worker     unsafe { (*info).name.as_ptr() }
84*33f37583SAndroid Build Coastguard Worker }
85*33f37583SAndroid Build Coastguard Worker 
86*33f37583SAndroid Build Coastguard Worker #[no_mangle]
87*33f37583SAndroid Build Coastguard Worker /// Returns a version of the APEX.
88*33f37583SAndroid Build Coastguard Worker ///
89*33f37583SAndroid Build Coastguard Worker /// # Safety
90*33f37583SAndroid Build Coastguard Worker ///
91*33f37583SAndroid Build Coastguard Worker /// The provided pointer must point to a valid object.
AApexInfo_getVersion(info: *const AApexInfo) -> i6492*33f37583SAndroid Build Coastguard Worker pub unsafe extern "C" fn AApexInfo_getVersion(info: *const AApexInfo) -> i64 {
93*33f37583SAndroid Build Coastguard Worker     // SAFETY: The pointer is not null, so the caller guarantees that it is valid.
94*33f37583SAndroid Build Coastguard Worker     unsafe { (*info).version }
95*33f37583SAndroid Build Coastguard Worker }
96