/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include #include "fscrypt_init_extensions.h" #include "result.h" using android::base::boot_clock; namespace android { namespace init { enum mount_mode { MOUNT_MODE_DEFAULT = 0, MOUNT_MODE_EARLY = 1, MOUNT_MODE_LATE = 2, }; static const char kColdBootDoneProp[] = "ro.cold_boot_done"; extern void (*trigger_shutdown)(const std::string& command); Result CreateSocket(const std::string& name, int type, bool passcred, bool should_listen, mode_t perm, uid_t uid, gid_t gid, const std::string& socketcon); Result ReadFile(const std::string& path); Result WriteFile(const std::string& path, const std::string& content); Result DecodeUid(const std::string& name); bool mkdir_recursive(const std::string& pathname, mode_t mode); int wait_for_file(const char* filename, std::chrono::nanoseconds timeout); bool make_dir(const std::string& path, mode_t mode); bool is_dir(const char* pathname); Result ExpandProps(const std::string& src); // Reads or compares the content of device tree file under the platform's Android DT directory. bool read_android_dt_file(const std::string& sub_path, std::string* dt_content); bool is_android_dt_value_expected(const std::string& sub_path, const std::string& expected_content); bool IsLegalPropertyName(const std::string& name); Result IsLegalPropertyValue(const std::string& name, const std::string& value); std::string CleanDirPath(const std::string& path); struct MkdirOptions { std::string target; mode_t mode; uid_t uid; gid_t gid; FscryptAction fscrypt_action; std::string ref_option; }; Result ParseMkdir(const std::vector& args); struct MountAllOptions { std::vector rc_paths; std::string fstab_path; mount_mode mode; bool import_rc; }; Result ParseMountAll(const std::vector& args); Result>> ParseRestorecon( const std::vector& args); Result ParseSwaponAll(const std::vector& args); Result ParseUmountAll(const std::vector& args); void SetStdioToDevNull(char** argv); void InitKernelLogging(char** argv); bool IsRecoveryMode(); bool IsDefaultMountNamespaceReady(); void SetDefaultMountNamespaceReady(); inline constexpr bool IsMicrodroid() { #ifdef MICRODROID return MICRODROID; #else return false; #endif } bool Has32BitAbi(); std::string GetApexNameFromFileName(const std::string& path); // Compare all files */path.#rc and */path.rc with the same path prefix. // Keep the one with the highest # that doesn't exceed the system's SDK. // (.rc == .0rc for ranking purposes) std::vector FilterVersionedConfigs(const std::vector& configs, int active_sdk); // Forks, executes the provided program in the child, and waits for the completion in the parent. // Child's stderr is captured and logged using LOG(ERROR). bool ForkExecveAndWaitForCompletion(const char* filename, char* const argv[]); } // namespace init } // namespace android