// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef INIT_UTILS_H_
#define INIT_UTILS_H_

#include <string>
#include <vector>
#include <libstorage/platform/platform.h>

#include <base/files/file.h>
#include <base/files/file_path.h>
#include <brillo/brillo_export.h>

namespace utils {

// Get the root device filepath, optionally removing the
// partition number.
// Return an empty path if unable to find the root device.
base::FilePath BRILLO_EXPORT GetRootDevice(bool strip_partition);

// Helper function to read a file to int
bool BRILLO_EXPORT ReadFileToInt(const base::FilePath& path, int* value);

// Run shutdown.
void BRILLO_EXPORT Reboot();

void BRILLO_EXPORT Restorecon(libstorage::Platform* platform_,
                              const base::FilePath& path,
                              const std::vector<base::FilePath>& exclude,
                              bool is_recursive,
                              bool set_digests);

// Searches `drive_name` for the partition labeled `partition_label` and
// returns its partition number if exactly one partition was found. Returns
// -1 on error.
int BRILLO_EXPORT GetPartitionNumber(const base::FilePath& drive_name,
                                     const std::string& partition_label);

// Splits a device path, for example /dev/mmcblk0p1, /dev/sda3,
// into the base device and partition numbers,
// which would be respectively /dev/mmcblk0p, 1; and /dev/sda, 3;
// Returns true on success.
bool BRILLO_EXPORT GetDevicePathComponents(const base::FilePath& device,
                                           std::string* base_device_out,
                                           int* partition_out);

// Reads successful and priority metadata from partition numbered
// `partition_number` on `disk`, storing the results in `successful_out` and
// `priority_out`, respectively. Returns true on success.
//
// successful is a 1 bit value indicating if a kernel partition
// has been successfully booted, while priority is a 4 bit value
// indicating what order the kernel partitions should be booted in, 15 being
// the highest, 1 the lowest, and 0 meaning not bootable.
// More information on partition metadata is available at.
// https://www.chromium.org/chromium-os/chromiumos-design-docs/disk-format
bool BRILLO_EXPORT ReadPartitionMetadata(const base::FilePath& disk,
                                         int partition_number,
                                         bool* successful_out,
                                         int* priority_out);

// Make sure the kernel partition numbered `kernel_partition` is still
// bootable after being wiped. The system may be in AU state that active
// kernel does not have "successful" bit set to 1, but the kernel has been
// successfully booted.
void BRILLO_EXPORT EnsureKernelIsBootable(const base::FilePath root_disk,
                                          int kernel_partition);

}  // namespace utils

#endif  // INIT_UTILS_H_
