Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12c85ec1 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "ueventd: Wait for runtime apex before running external firmware...

Merge "ueventd: Wait for runtime apex before running external firmware handler" am: 852e22d7 am: f326444c am: 3bf1e551

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1926942



Change-Id: I297011091c3ba9371c50f132bcc83c5c6cab2928
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 68978075 3bf1e551
Loading
Loading
Loading
Loading
+34 −0
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@
#include <android-base/chrono_utils.h>
#include <android-base/chrono_utils.h>
#include <android-base/file.h>
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/scopeguard.h>
#include <android-base/scopeguard.h>
#include <android-base/strings.h>
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
#include <android-base/unique_fd.h>
@@ -43,6 +44,7 @@ using android::base::Split;
using android::base::Timer;
using android::base::Timer;
using android::base::Trim;
using android::base::Trim;
using android::base::unique_fd;
using android::base::unique_fd;
using android::base::WaitForProperty;
using android::base::WriteFully;
using android::base::WriteFully;


namespace android {
namespace android {
@@ -82,6 +84,33 @@ static bool IsBooting() {
    return access("/dev/.booting", F_OK) == 0;
    return access("/dev/.booting", F_OK) == 0;
}
}


static bool IsApexActivated() {
    static bool apex_activated = []() {
        // Wait for com.android.runtime.apex activation
        // Property name and value must be kept in sync with system/apexd/apex/apex_constants.h
        // 60s is the default firmware sysfs fallback timeout. (/sys/class/firmware/timeout)
        if (!WaitForProperty("apexd.status", "activated", 60s)) {
            LOG(ERROR) << "Apexd activation wait timeout";
            return false;
        }
        return true;
    }();

    return apex_activated;
}

static bool NeedsRerunExternalHandler() {
    static bool first = true;

    // Rerun external handler only on the first try and when apex is activated
    if (first) {
        first = false;
        return IsApexActivated();
    }

    return first;
}

ExternalFirmwareHandler::ExternalFirmwareHandler(std::string devpath, uid_t uid, gid_t gid,
ExternalFirmwareHandler::ExternalFirmwareHandler(std::string devpath, uid_t uid, gid_t gid,
                                                 std::string handler_path)
                                                 std::string handler_path)
    : devpath(std::move(devpath)), uid(uid), gid(gid), handler_path(std::move(handler_path)) {
    : devpath(std::move(devpath)), uid(uid), gid(gid), handler_path(std::move(handler_path)) {
@@ -210,6 +239,11 @@ std::string FirmwareHandler::GetFirmwarePath(const Uevent& uevent) const {


            auto result = RunExternalHandler(external_handler.handler_path, external_handler.uid,
            auto result = RunExternalHandler(external_handler.handler_path, external_handler.uid,
                                             external_handler.gid, uevent);
                                             external_handler.gid, uevent);
            if (!result.ok() && NeedsRerunExternalHandler()) {
                auto res = RunExternalHandler(external_handler.handler_path, external_handler.uid,
                                              external_handler.gid, uevent);
                result = std::move(res);
            }
            if (!result.ok()) {
            if (!result.ok()) {
                LOG(ERROR) << "Using default firmware; External firmware handler failed: "
                LOG(ERROR) << "Using default firmware; External firmware handler failed: "
                           << result.error();
                           << result.error();