diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd.rc b/fs_mgr/libsnapshot/snapuserd/snapuserd.rc index 02fda8d3d..275009603 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd.rc +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd.rc @@ -14,3 +14,6 @@ service snapuserd_proxy /system/bin/snapuserd -socket-handoff user root group root system seclabel u:r:snapuserd:s0 + +on property:init.svc.snapuserd=stopped + setprop snapuserd.ready false diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp index 81e922845..1ea05a3b0 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp @@ -42,13 +42,15 @@ using namespace std::chrono_literals; using android::base::unique_fd; bool EnsureSnapuserdStarted() { - if (android::base::GetProperty("init.svc.snapuserd", "") == "running") { - return true; + if (android::base::GetProperty("init.svc.snapuserd", "") != "running") { + android::base::SetProperty("ctl.start", "snapuserd"); + if (!android::base::WaitForProperty("init.svc.snapuserd", "running", 10s)) { + LOG(ERROR) << "Timed out waiting for snapuserd to start."; + return false; + } } - - android::base::SetProperty("ctl.start", "snapuserd"); - if (!android::base::WaitForProperty("init.svc.snapuserd", "running", 10s)) { - LOG(ERROR) << "Timed out waiting for snapuserd to start."; + if (!android::base::WaitForProperty("snapuserd.ready", "true", 10s)) { + LOG(ERROR) << "Timed out waiting for snapuserd to be ready."; return false; } return true; diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp index a29b19b5a..672c13c5f 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp @@ -291,6 +291,14 @@ bool SnapuserdServer::StartWithSocket(bool start_listening) { AddWatchedFd(sockfd_, POLLIN); + // If started in first-stage init, the property service won't be online. + if (access("/dev/socket/property_service", F_OK) == 0) { + if (!android::base::SetProperty("snapuserd.ready", "true")) { + LOG(ERROR) << "Failed to set snapuserd.ready property"; + return false; + } + } + LOG(DEBUG) << "Snapuserd server now accepting connections"; return true; }