blob: f22c785fc058d5ed950334840dd71b405dc2cbd3 [file] [log] [blame]
Victor Hsieh272aa242021-02-01 14:19:20 -08001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Victor Hsieh51789de2021-08-06 16:50:49 -070017//! compsvc is a service to run compilation tasks in a PVM upon request. It is able to set up
Victor Hsiehebb1d902021-08-06 13:00:18 -070018//! file descriptors backed by authfs (via authfs_service) and pass the file descriptors to the
Victor Hsieh51789de2021-08-06 16:50:49 -070019//! actual compiler.
Victor Hsieh272aa242021-02-01 14:19:20 -080020
Victor Hsieh51789de2021-08-06 16:50:49 -070021use std::path::PathBuf;
Victor Hsieh272aa242021-02-01 14:19:20 -080022
Victor Hsieh51789de2021-08-06 16:50:49 -070023use crate::compilation::compile;
Alan Stokes7ec4e7f2021-07-21 11:29:10 +010024use crate::signer::Signer;
Victor Hsieh51789de2021-08-06 16:50:49 -070025use authfs_aidl_interface::aidl::com::android::virt::fs::IAuthFsService::IAuthFsService;
Victor Hsieh272aa242021-02-01 14:19:20 -080026use compos_aidl_interface::aidl::com::android::compos::ICompService::{
27 BnCompService, ICompService,
28};
29use compos_aidl_interface::aidl::com::android::compos::Metadata::Metadata;
30use compos_aidl_interface::binder::{
Victor Hsieh51789de2021-08-06 16:50:49 -070031 BinderFeatures, ExceptionCode, Interface, Result as BinderResult, Status, Strong,
Victor Hsieh272aa242021-02-01 14:19:20 -080032};
Victor Hsieh51789de2021-08-06 16:50:49 -070033use std::ffi::CString;
Victor Hsieh272aa242021-02-01 14:19:20 -080034
Victor Hsiehebb1d902021-08-06 13:00:18 -070035const AUTHFS_SERVICE_NAME: &str = "authfs_service";
Victor Hsieh51789de2021-08-06 16:50:49 -070036const DEX2OAT_PATH: &str = "/apex/com.android.art/bin/dex2oat64";
Alan Stokes9e2c5d52021-07-21 11:29:10 +010037
Victor Hsieh51789de2021-08-06 16:50:49 -070038/// Constructs a binder object that implements ICompService.
39pub fn new_binder(signer: Option<Box<dyn Signer>>) -> Strong<dyn ICompService> {
40 let service = CompService { dex2oat_path: PathBuf::from(DEX2OAT_PATH), signer };
Alan Stokes9e2c5d52021-07-21 11:29:10 +010041 BnCompService::new_binder(service, BinderFeatures::default())
42}
43
Victor Hsieh272aa242021-02-01 14:19:20 -080044struct CompService {
Victor Hsieh51789de2021-08-06 16:50:49 -070045 dex2oat_path: PathBuf,
Alan Stokes7ec4e7f2021-07-21 11:29:10 +010046 #[allow(dead_code)] // TODO: Make use of this
47 signer: Option<Box<dyn Signer>>,
Victor Hsieh272aa242021-02-01 14:19:20 -080048}
49
Victor Hsieh272aa242021-02-01 14:19:20 -080050impl Interface for CompService {}
51
52impl ICompService for CompService {
53 fn execute(&self, args: &[String], metadata: &Metadata) -> BinderResult<i8> {
Victor Hsieh51789de2021-08-06 16:50:49 -070054 let authfs_service = get_authfs_service()?;
55 compile(&self.dex2oat_path, args, authfs_service, metadata).map_err(|e| {
56 new_binder_exception(
57 ExceptionCode::SERVICE_SPECIFIC,
58 format!("Compilation failed: {}", e),
59 )
60 })
Victor Hsieh272aa242021-02-01 14:19:20 -080061 }
62}
Victor Hsiehebb1d902021-08-06 13:00:18 -070063
64fn get_authfs_service() -> BinderResult<Strong<dyn IAuthFsService>> {
65 Ok(authfs_aidl_interface::binder::get_interface(AUTHFS_SERVICE_NAME)?)
66}
67
Victor Hsiehebb1d902021-08-06 13:00:18 -070068fn new_binder_exception<T: AsRef<str>>(exception: ExceptionCode, message: T) -> Status {
69 Status::new_exception(exception, CString::new(message.as_ref()).as_deref().ok())
70}