xref: /aosp_15_r20/frameworks/native/cmds/installd/execv_helper.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "installd"
17*38e8c45fSAndroid Build Coastguard Worker 
18*38e8c45fSAndroid Build Coastguard Worker #include "execv_helper.h"
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <stdlib.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <unistd.h>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker #include <string>
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker #include <android-base/logging.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker namespace android {
29*38e8c45fSAndroid Build Coastguard Worker namespace installd {
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker // Store a placeholder for the binary name.
ExecVHelper()32*38e8c45fSAndroid Build Coastguard Worker ExecVHelper::ExecVHelper() : args_(1u, std::string()) {}
33*38e8c45fSAndroid Build Coastguard Worker 
~ExecVHelper()34*38e8c45fSAndroid Build Coastguard Worker ExecVHelper::~ExecVHelper() {}
35*38e8c45fSAndroid Build Coastguard Worker 
PrepareArgs(const std::string & bin)36*38e8c45fSAndroid Build Coastguard Worker void ExecVHelper::PrepareArgs(const std::string& bin) {
37*38e8c45fSAndroid Build Coastguard Worker     CHECK(!args_.empty());
38*38e8c45fSAndroid Build Coastguard Worker     CHECK(args_[0].empty());
39*38e8c45fSAndroid Build Coastguard Worker     args_[0] = bin;
40*38e8c45fSAndroid Build Coastguard Worker     // Write char* into array.
41*38e8c45fSAndroid Build Coastguard Worker     for (const std::string& arg : args_) {
42*38e8c45fSAndroid Build Coastguard Worker         argv_.push_back(arg.c_str());
43*38e8c45fSAndroid Build Coastguard Worker     }
44*38e8c45fSAndroid Build Coastguard Worker     argv_.push_back(nullptr);  // Add null terminator.
45*38e8c45fSAndroid Build Coastguard Worker }
46*38e8c45fSAndroid Build Coastguard Worker 
Exec(int exit_code)47*38e8c45fSAndroid Build Coastguard Worker void ExecVHelper::Exec(int exit_code) {
48*38e8c45fSAndroid Build Coastguard Worker     execv(argv_[0], (char * const *)&argv_[0]);
49*38e8c45fSAndroid Build Coastguard Worker     PLOG(ERROR) << "execv(" << argv_[0] << ") failed";
50*38e8c45fSAndroid Build Coastguard Worker     exit(exit_code);
51*38e8c45fSAndroid Build Coastguard Worker }
52*38e8c45fSAndroid Build Coastguard Worker 
AddArg(const std::string & arg)53*38e8c45fSAndroid Build Coastguard Worker void ExecVHelper::AddArg(const std::string& arg) {
54*38e8c45fSAndroid Build Coastguard Worker     if (!arg.empty()) {
55*38e8c45fSAndroid Build Coastguard Worker         args_.push_back(arg);
56*38e8c45fSAndroid Build Coastguard Worker     }
57*38e8c45fSAndroid Build Coastguard Worker }
58*38e8c45fSAndroid Build Coastguard Worker 
AddRuntimeArg(const std::string & arg)59*38e8c45fSAndroid Build Coastguard Worker void ExecVHelper::AddRuntimeArg(const std::string& arg) {
60*38e8c45fSAndroid Build Coastguard Worker     if (!arg.empty()) {
61*38e8c45fSAndroid Build Coastguard Worker         args_.push_back("--runtime-arg");
62*38e8c45fSAndroid Build Coastguard Worker         args_.push_back(arg);
63*38e8c45fSAndroid Build Coastguard Worker     }
64*38e8c45fSAndroid Build Coastguard Worker }
65*38e8c45fSAndroid Build Coastguard Worker 
66*38e8c45fSAndroid Build Coastguard Worker }  // namespace installd
67*38e8c45fSAndroid Build Coastguard Worker }  // namespace android
68