Currently the ReadDefaultFstab function, which calls GetFstabPath,
makes some assumptions about what the fstab will be called and where
it is located. This is being used by vold to set up userdata encryption
and for gsid, and is even used in the default boot control HAL, so it
has become quite baked.
The original way for a board to specify things to mount was to use the
"mount_all /path/to/fstab" command in init.rc. However, due to the
above functionality, the path after mount_all is no longer very useful,
as it cannot differ from the inferred path, or userdata encryption and
other features will be broken.
On Cuttlefish, we have an interest in being able to test alternative
userdata configurations (ext4 vs f2fs, encryption on/off, etc.) and
currently the only way to achieve this is to either a) modify the
ro.hardware or ro.hardware.platform properties, which breaks a bunch
of things like default HAL filenames, or regenerate our odm.img or
vendor.img filesystems. We can't simply install another fstab and
point to it with "mount_all".
This change allows the fstab path to be omitted from "mount_all", and
adds another property which overrides the existing checks for
fstab.${ro.hardware} and fstab.${ro.hardware.platform}. Specifying
${ro.boot.fstab_suffix} will cause fstab.${ro.boot.fstab_suffix}
to be checked first.
Bug: 142424832
Test: booted cuttlefish with 'mount_all ${ro.hardware} --late'
Test: booted cuttlefish with 'mount_all --late'
Test: booted cuttlefish with 'mount_all --late' and fstab_suffix=f2fs
Test: partially booted cuttlefish with 'mount_all ${ro.hardware}'
Test: partially booted cuttlefish with 'mount_all'
Change-Id: I3e10f66aecfcd48bdb9ebf1d304b7aae745cbd3c
103 lines
3.3 KiB
C++
103 lines
3.3 KiB
C++
/*
|
|
* 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 <sys/stat.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <chrono>
|
|
#include <functional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <android-base/chrono_utils.h>
|
|
|
|
#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<int> CreateSocket(const std::string& name, int type, bool passcred, mode_t perm, uid_t uid,
|
|
gid_t gid, const std::string& socketcon);
|
|
|
|
Result<std::string> ReadFile(const std::string& path);
|
|
Result<void> WriteFile(const std::string& path, const std::string& content);
|
|
|
|
Result<uid_t> 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);
|
|
void ImportKernelCmdline(const std::function<void(const std::string&, const std::string&)>&);
|
|
bool make_dir(const std::string& path, mode_t mode);
|
|
bool is_dir(const char* pathname);
|
|
Result<std::string> ExpandProps(const std::string& src);
|
|
|
|
// Returns the platform's Android DT directory as specified in the kernel cmdline.
|
|
// If the platform does not configure a custom DT path, returns the standard one (based in procfs).
|
|
const std::string& get_android_dt_dir();
|
|
// 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<void> IsLegalPropertyValue(const std::string& name, const std::string& value);
|
|
|
|
struct MkdirOptions {
|
|
std::string target;
|
|
mode_t mode;
|
|
uid_t uid;
|
|
gid_t gid;
|
|
FscryptAction fscrypt_action;
|
|
std::string ref_option;
|
|
};
|
|
|
|
Result<MkdirOptions> ParseMkdir(const std::vector<std::string>& args);
|
|
|
|
struct MountAllOptions {
|
|
std::vector<std::string> rc_paths;
|
|
std::string fstab_path;
|
|
mount_mode mode;
|
|
bool import_rc;
|
|
};
|
|
|
|
Result<MountAllOptions> ParseMountAll(const std::vector<std::string>& args);
|
|
|
|
Result<std::pair<int, std::vector<std::string>>> ParseRestorecon(
|
|
const std::vector<std::string>& args);
|
|
|
|
Result<std::string> ParseUmountAll(const std::vector<std::string>& args);
|
|
|
|
void SetStdioToDevNull(char** argv);
|
|
void InitKernelLogging(char** argv);
|
|
void InitSecondStageLogging(char** argv);
|
|
void DumpShutdownDebugInformation();
|
|
bool IsRecoveryMode();
|
|
} // namespace init
|
|
} // namespace android
|