Loading adb/daemon/usb.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -117,7 +117,7 @@ struct TransferId { struct IoBlock { bool pending = false; struct iocb control; struct iocb control = {}; std::shared_ptr<Block> payload; TransferId id() const { return TransferId::from_value(control.aio_data); } Loading init/README.md +2 −1 Original line number Diff line number Diff line Loading @@ -414,7 +414,8 @@ Commands `class_start_post_data <serviceclass>` > Like `class_start`, but only considers services that were started after /data was mounted. Only used for FDE devices. after /data was mounted, and that were running at the time `class_reset_post_data` was called. Only used for FDE devices. `class_stop <serviceclass>` > Stop and disable all services of the specified class if they are Loading init/builtins.cpp +13 −12 Original line number Diff line number Diff line Loading @@ -104,35 +104,36 @@ static void ForEachServiceInClass(const std::string& classname, F function) { } } static Result<Success> class_start(const std::string& class_name, bool post_data_only) { static Result<Success> do_class_start(const BuiltinArguments& args) { // Do not start a class if it has a property persist.dont_start_class.CLASS set to 1. if (android::base::GetBoolProperty("persist.init.dont_start_class." + class_name, false)) if (android::base::GetBoolProperty("persist.init.dont_start_class." + args[1], false)) return Success(); // Starting a class does not start services which are explicitly disabled. // They must be started individually. for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(class_name)) { if (post_data_only && !service->is_post_data()) { continue; } if (service->classnames().count(args[1])) { if (auto result = service->StartIfNotDisabled(); !result) { LOG(ERROR) << "Could not start service '" << service->name() << "' as part of class '" << class_name << "': " << result.error(); << "' as part of class '" << args[1] << "': " << result.error(); } } } return Success(); } static Result<Success> do_class_start(const BuiltinArguments& args) { return class_start(args[1], false /* post_data_only */); } static Result<Success> do_class_start_post_data(const BuiltinArguments& args) { if (args.context != kInitContext) { return Error() << "command 'class_start_post_data' only available in init context"; } return class_start(args[1], true /* post_data_only */); for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(args[1])) { if (auto result = service->StartIfPostData(); !result) { LOG(ERROR) << "Could not start service '" << service->name() << "' as part of class '" << args[1] << "': " << result.error(); } } } return Success(); } static Result<Success> do_class_stop(const BuiltinArguments& args) { Loading init/service.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -1154,10 +1154,23 @@ void Service::Reset() { void Service::ResetIfPostData() { if (post_data_) { if (flags_ & SVC_RUNNING) { running_at_post_data_reset_ = true; } StopOrReset(SVC_RESET); } } Result<Success> Service::StartIfPostData() { // Start the service, but only if it was started after /data was mounted, // and it was still running when we reset the post-data services. if (running_at_post_data_reset_) { return Start(); } return Success(); } void Service::Stop() { StopOrReset(SVC_DISABLED); } Loading init/service.h +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ class Service { Result<Success> ExecStart(); Result<Success> Start(); Result<Success> StartIfNotDisabled(); Result<Success> StartIfPostData(); Result<Success> Enable(); void Reset(); void ResetIfPostData(); Loading Loading @@ -248,6 +249,8 @@ class Service { bool pre_apexd_ = false; bool post_data_ = false; bool running_at_post_data_reset_ = false; }; class ServiceList { Loading Loading
adb/daemon/usb.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -117,7 +117,7 @@ struct TransferId { struct IoBlock { bool pending = false; struct iocb control; struct iocb control = {}; std::shared_ptr<Block> payload; TransferId id() const { return TransferId::from_value(control.aio_data); } Loading
init/README.md +2 −1 Original line number Diff line number Diff line Loading @@ -414,7 +414,8 @@ Commands `class_start_post_data <serviceclass>` > Like `class_start`, but only considers services that were started after /data was mounted. Only used for FDE devices. after /data was mounted, and that were running at the time `class_reset_post_data` was called. Only used for FDE devices. `class_stop <serviceclass>` > Stop and disable all services of the specified class if they are Loading
init/builtins.cpp +13 −12 Original line number Diff line number Diff line Loading @@ -104,35 +104,36 @@ static void ForEachServiceInClass(const std::string& classname, F function) { } } static Result<Success> class_start(const std::string& class_name, bool post_data_only) { static Result<Success> do_class_start(const BuiltinArguments& args) { // Do not start a class if it has a property persist.dont_start_class.CLASS set to 1. if (android::base::GetBoolProperty("persist.init.dont_start_class." + class_name, false)) if (android::base::GetBoolProperty("persist.init.dont_start_class." + args[1], false)) return Success(); // Starting a class does not start services which are explicitly disabled. // They must be started individually. for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(class_name)) { if (post_data_only && !service->is_post_data()) { continue; } if (service->classnames().count(args[1])) { if (auto result = service->StartIfNotDisabled(); !result) { LOG(ERROR) << "Could not start service '" << service->name() << "' as part of class '" << class_name << "': " << result.error(); << "' as part of class '" << args[1] << "': " << result.error(); } } } return Success(); } static Result<Success> do_class_start(const BuiltinArguments& args) { return class_start(args[1], false /* post_data_only */); } static Result<Success> do_class_start_post_data(const BuiltinArguments& args) { if (args.context != kInitContext) { return Error() << "command 'class_start_post_data' only available in init context"; } return class_start(args[1], true /* post_data_only */); for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(args[1])) { if (auto result = service->StartIfPostData(); !result) { LOG(ERROR) << "Could not start service '" << service->name() << "' as part of class '" << args[1] << "': " << result.error(); } } } return Success(); } static Result<Success> do_class_stop(const BuiltinArguments& args) { Loading
init/service.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -1154,10 +1154,23 @@ void Service::Reset() { void Service::ResetIfPostData() { if (post_data_) { if (flags_ & SVC_RUNNING) { running_at_post_data_reset_ = true; } StopOrReset(SVC_RESET); } } Result<Success> Service::StartIfPostData() { // Start the service, but only if it was started after /data was mounted, // and it was still running when we reset the post-data services. if (running_at_post_data_reset_) { return Start(); } return Success(); } void Service::Stop() { StopOrReset(SVC_DISABLED); } Loading
init/service.h +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ class Service { Result<Success> ExecStart(); Result<Success> Start(); Result<Success> StartIfNotDisabled(); Result<Success> StartIfPostData(); Result<Success> Enable(); void Reset(); void ResetIfPostData(); Loading Loading @@ -248,6 +249,8 @@ class Service { bool pre_apexd_ = false; bool post_data_ = false; bool running_at_post_data_reset_ = false; }; class ServiceList { Loading