diff options
author | 2019-06-25 09:33:32 -0700 | |
---|---|---|
committer | 2019-07-12 00:44:27 +0000 | |
commit | 552e407f8ec5f84d3ff40b783065ea06094ba357 (patch) | |
tree | 687f4714ecbcc4680c69db26e368cb2f1a49eea4 | |
parent | e416f707865e0a5ffedf13a1c91495146adc895c (diff) |
lshal: add wait command
Waits for an interface to start (e.g. for scripting certain tests).
Fixes: 135956088
Test: the following
$ adb shell lshal wait android.hardware.nfc@1.0::INfc/foo
Service not found (missing permissions or not in VINTF manifest?).
$ echo $?
128
$ adb shell lshal wait android.hardware.nfc@1.0::INfc/default
$ echo $?
0
Test: lshal_test
Change-Id: I355fc33f9e46bac573a38425205e8db81f19a36e
-rw-r--r-- | cmds/lshal/Android.bp | 1 | ||||
-rw-r--r-- | cmds/lshal/Lshal.cpp | 3 | ||||
-rw-r--r-- | cmds/lshal/Lshal.h | 1 | ||||
-rw-r--r-- | cmds/lshal/WaitCommand.cpp | 87 | ||||
-rw-r--r-- | cmds/lshal/WaitCommand.h | 49 |
5 files changed, 140 insertions, 1 deletions
diff --git a/cmds/lshal/Android.bp b/cmds/lshal/Android.bp index f7dd8c82c3..4401862ee1 100644 --- a/cmds/lshal/Android.bp +++ b/cmds/lshal/Android.bp @@ -36,6 +36,7 @@ cc_library_static { "TableEntry.cpp", "TextTable.cpp", "utils.cpp", + "WaitCommand.cpp", ], cflags: [ "-Wall", diff --git a/cmds/lshal/Lshal.cpp b/cmds/lshal/Lshal.cpp index 8c83457d3b..132b31ebc3 100644 --- a/cmds/lshal/Lshal.cpp +++ b/cmds/lshal/Lshal.cpp @@ -26,7 +26,9 @@ #include <hidl/HidlTransportUtils.h> #include "DebugCommand.h" +#include "HelpCommand.h" #include "ListCommand.h" +#include "WaitCommand.h" #include "PipeRelay.h" namespace android { @@ -49,6 +51,7 @@ Lshal::Lshal(std::ostream &out, std::ostream &err, mRegisteredCommands.push_back({std::make_unique<ListCommand>(*this)}); mRegisteredCommands.push_back({std::make_unique<DebugCommand>(*this)}); mRegisteredCommands.push_back({std::make_unique<HelpCommand>(*this)}); + mRegisteredCommands.push_back({std::make_unique<WaitCommand>(*this)}); } void Lshal::forEachCommand(const std::function<void(const Command* c)>& f) const { diff --git a/cmds/lshal/Lshal.h b/cmds/lshal/Lshal.h index 2679650611..830bd872ff 100644 --- a/cmds/lshal/Lshal.h +++ b/cmds/lshal/Lshal.h @@ -24,7 +24,6 @@ #include <utils/StrongPointer.h> #include "Command.h" -#include "HelpCommand.h" #include "NullableOStream.h" #include "utils.h" diff --git a/cmds/lshal/WaitCommand.cpp b/cmds/lshal/WaitCommand.cpp new file mode 100644 index 0000000000..65b41b95d2 --- /dev/null +++ b/cmds/lshal/WaitCommand.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2019 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. + */ + +#include "WaitCommand.h" + +#include "Lshal.h" + +#include <hidl/ServiceManagement.h> +#include <hidl-util/FQName.h> + +namespace android { +namespace lshal { + +std::string WaitCommand::getName() const { + return "wait"; +} + +std::string WaitCommand::getSimpleDescription() const { + return "Wait for HAL to start if it is not already started."; +} + +Status WaitCommand::parseArgs(const Arg &arg) { + if (optind + 1 != arg.argc) { + return USAGE; + } + + mInterfaceName = arg.argv[optind]; + ++optind; + return OK; +} + +Status WaitCommand::main(const Arg &arg) { + Status status = parseArgs(arg); + if (status != OK) { + return status; + } + + auto [interface, instance] = splitFirst(mInterfaceName, '/'); + instance = instance.empty() ? "default" : instance; + + FQName fqName; + if (!FQName::parse(interface, &fqName) || fqName.isIdentifier() || !fqName.isFullyQualified()) { + mLshal.err() << "Invalid fully-qualified name '" << interface << "'\n\n"; + return USAGE; + } + + using android::hidl::manager::V1_0::IServiceManager; + + using android::hardware::details::getRawServiceInternal; + auto service = getRawServiceInternal(interface, instance, true /*retry*/, false /*getStub*/); + + if (service == nullptr) { + mLshal.err() << "Service not found (missing permissions or not in VINTF manifest?).\n"; + return NO_INTERFACE; + } + + return OK; +} + +void WaitCommand::usage() const { + static const std::string debug = + "wait:\n" + " lshal wait <interface/instance> \n" + " For a HAL that is on the device, wait for the HAL to start.\n" + " This will not start a HAL unless it is configured as a lazy HAL.\n" + " <interface>: Format is `android.hardware.foo@1.0::IFoo/default`.\n" + " If instance name is missing `default` is used.\n"; + + mLshal.err() << debug; +} + +} // namespace lshal +} // namespace android + diff --git a/cmds/lshal/WaitCommand.h b/cmds/lshal/WaitCommand.h new file mode 100644 index 0000000000..c9f67c2b27 --- /dev/null +++ b/cmds/lshal/WaitCommand.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2019 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 <string> + +#include <android-base/macros.h> + +#include "Command.h" +#include "utils.h" + +namespace android { +namespace lshal { + +class Lshal; + +class WaitCommand : public Command { +public: + explicit WaitCommand(Lshal &lshal) : Command(lshal) {} + ~WaitCommand() = default; + Status main(const Arg &arg) override; + void usage() const override; + std::string getSimpleDescription() const override; + std::string getName() const override; +private: + Status parseArgs(const Arg &arg); + + std::string mInterfaceName; + + DISALLOW_COPY_AND_ASSIGN(WaitCommand); +}; + + +} // namespace lshal +} // namespace android |