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

Commit 3926655c authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 4545621 from 7f49e465 to pi-release

Change-Id: I26df4f6a653c30f29aa5a8e8082c54e0ee2f4c94
parents 7ae57251 7f49e465
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -38,6 +38,12 @@
#define PT_GUARDED_BY(x) \
      THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))

#define EXCLUSIVE_LOCKS_REQUIRED(...) \
      THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__))

#define SHARED_LOCKS_REQUIRED(...) \
      THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__))

#define ACQUIRED_BEFORE(...) \
      THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__))

+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ cc_binary {
    static_libs: [
        "android.hardware.health@2.0-impl",
        "android.hardware.health@1.0-convert",
        "libhealthstoragedefault",
        "libbatterymonitor",
    ],

@@ -72,6 +73,7 @@ cc_binary {
        "android.hardware.health@2.0-impl",
        "android.hardware.health@1.0-convert",
        "libbatterymonitor",
        "libhealthstoragedefault",
    ],

    shared_libs: [
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ LOCAL_STATIC_LIBRARIES := \
    android.hardware.health@2.0 \
    android.hardware.health@2.0-impl \
    android.hardware.health@1.0 \
    libhealthstoragedefault \
    libminui \
    libpng \
    libz \
@@ -98,6 +99,7 @@ CHARGER_STATIC_LIBRARIES := \
    libhidltransport \
    libhidlbase \
    libhwbinder \
    libhealthstoragedefault \
    libvndksupport \
    libhealthd_charger \
    libhealthd_draw \
+12 −5
Original line number Diff line number Diff line
@@ -50,12 +50,19 @@ Command::Command(BuiltinFunction f, bool execute_in_subcontext,
    : func_(std::move(f)), execute_in_subcontext_(execute_in_subcontext), args_(args), line_(line) {}

Result<Success> Command::InvokeFunc(Subcontext* subcontext) const {
    if (execute_in_subcontext_ && subcontext) {
    if (subcontext) {
        if (execute_in_subcontext_) {
            return subcontext->Execute(args_);
    } else {
        const std::string& context = subcontext ? subcontext->context() : kInitContext;
        return RunBuiltinFunction(func_, args_, context);
        }

        auto expanded_args = subcontext->ExpandArgs(args_);
        if (!expanded_args) {
            return expanded_args.error();
        }
        return RunBuiltinFunction(func_, *expanded_args, subcontext->context());
    }

    return RunBuiltinFunction(func_, args_, kInitContext);
}

std::string Command::BuildCommandString() const {
+77 −27
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@

#include "action.h"
#include "selinux.h"
#include "system/core/init/subcontext.pb.h"
#include "util.h"

using android::base::GetExecutablePath;
@@ -84,7 +83,9 @@ class SubcontextProcess {

  private:
    void RunCommand(const SubcontextCommand::ExecuteCommand& execute_command,
                    SubcontextReply::ResultMessage* result_message) const;
                    SubcontextReply* reply) const;
    void ExpandArgs(const SubcontextCommand::ExpandArgsCommand& expand_args_command,
                    SubcontextReply* reply) const;

    const KeywordFunctionMap* function_map_;
    const std::string context_;
@@ -92,7 +93,7 @@ class SubcontextProcess {
};

void SubcontextProcess::RunCommand(const SubcontextCommand::ExecuteCommand& execute_command,
                                   SubcontextReply::ResultMessage* result_message) const {
                                   SubcontextReply* reply) const {
    // Need to use ArraySplice instead of this code.
    auto args = std::vector<std::string>();
    for (const auto& string : execute_command.args()) {
@@ -108,11 +109,27 @@ void SubcontextProcess::RunCommand(const SubcontextCommand::ExecuteCommand& exec
    }

    if (result) {
        result_message->set_success(true);
        reply->set_success(true);
    } else {
        result_message->set_success(false);
        result_message->set_error_string(result.error_string());
        result_message->set_error_errno(result.error_errno());
        auto* failure = reply->mutable_failure();
        failure->set_error_string(result.error_string());
        failure->set_error_errno(result.error_errno());
    }
}

void SubcontextProcess::ExpandArgs(const SubcontextCommand::ExpandArgsCommand& expand_args_command,
                                   SubcontextReply* reply) const {
    for (const auto& arg : expand_args_command.args()) {
        auto expanded_prop = std::string{};
        if (!expand_props(arg, &expanded_prop)) {
            auto* failure = reply->mutable_failure();
            failure->set_error_string("Failed to expand '" + arg + "'");
            failure->set_error_errno(0);
            return;
        } else {
            auto* expand_args_reply = reply->mutable_expand_args_reply();
            expand_args_reply->add_expanded_args(expanded_prop);
        }
    }
}

@@ -142,7 +159,11 @@ void SubcontextProcess::MainLoop() {
        auto reply = SubcontextReply();
        switch (subcontext_command.command_case()) {
            case SubcontextCommand::kExecuteCommand: {
                RunCommand(subcontext_command.execute_command(), reply.mutable_result());
                RunCommand(subcontext_command.execute_command(), &reply);
                break;
            }
            case SubcontextCommand::kExpandArgsCommand: {
                ExpandArgs(subcontext_command.expand_args_command(), &reply);
                break;
            }
            default:
@@ -219,12 +240,7 @@ void Subcontext::Restart() {
    Fork();
}

Result<Success> Subcontext::Execute(const std::vector<std::string>& args) {
    auto subcontext_command = SubcontextCommand();
    std::copy(
        args.begin(), args.end(),
        RepeatedPtrFieldBackInserter(subcontext_command.mutable_execute_command()->mutable_args()));

Result<SubcontextReply> Subcontext::TransmitMessage(const SubcontextCommand& subcontext_command) {
    if (auto result = SendMessage(socket_, subcontext_command); !result) {
        Restart();
        return ErrnoError() << "Failed to send message to subcontext";
@@ -236,25 +252,59 @@ Result<Success> Subcontext::Execute(const std::vector<std::string>& args) {
        return Error() << "Failed to receive result from subcontext: " << subcontext_message.error();
    }

    auto subcontext_reply = SubcontextReply();
    auto subcontext_reply = SubcontextReply{};
    if (!subcontext_reply.ParseFromString(*subcontext_message)) {
        Restart();
        return Error() << "Unable to parse message from subcontext";
    }
    if (subcontext_reply.reply_case() == SubcontextReply::kFailure) {
        auto& failure = subcontext_reply.failure();
        return ResultError(failure.error_string(), failure.error_errno());
    }
    return subcontext_reply;
}

Result<Success> Subcontext::Execute(const std::vector<std::string>& args) {
    auto subcontext_command = SubcontextCommand();
    std::copy(
        args.begin(), args.end(),
        RepeatedPtrFieldBackInserter(subcontext_command.mutable_execute_command()->mutable_args()));

    auto subcontext_reply = TransmitMessage(subcontext_command);
    if (!subcontext_reply) {
        return subcontext_reply.error();
    }

    if (subcontext_reply->reply_case() != SubcontextReply::kSuccess) {
        return Error() << "Unexpected message type from subcontext: "
                       << subcontext_reply->reply_case();
    }

    switch (subcontext_reply.reply_case()) {
        case SubcontextReply::kResult: {
            auto result = subcontext_reply.result();
            if (result.success()) {
    return Success();
            } else {
                return ResultError(result.error_string(), result.error_errno());
}

Result<std::vector<std::string>> Subcontext::ExpandArgs(const std::vector<std::string>& args) {
    auto subcontext_command = SubcontextCommand{};
    std::copy(args.begin(), args.end(),
              RepeatedPtrFieldBackInserter(
                  subcontext_command.mutable_expand_args_command()->mutable_args()));

    auto subcontext_reply = TransmitMessage(subcontext_command);
    if (!subcontext_reply) {
        return subcontext_reply.error();
    }

    if (subcontext_reply->reply_case() != SubcontextReply::kExpandArgsReply) {
        return Error() << "Unexpected message type from subcontext: "
                       << subcontext_reply->reply_case();
    }
        default:
            return Error() << "Unknown message type from subcontext: "
                           << subcontext_reply.reply_case();

    auto& reply = subcontext_reply->expand_args_reply();
    auto expanded_args = std::vector<std::string>{};
    for (const auto& string : reply.expanded_args()) {
        expanded_args.emplace_back(string);
    }
    return expanded_args;
}

static std::vector<Subcontext> subcontexts;
Loading