blob: 07908ba5b30272b8e3ad796700f0f4a53970f646 [file] [log] [blame]
Steven Moreland80e1e6d2019-06-21 12:35:59 -07001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/logging.h>
Steven Moreland454bfd92022-07-20 20:53:36 +000018#include <android-base/properties.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070019#include <binder/IPCThreadState.h>
20#include <binder/ProcessState.h>
21#include <binder/Status.h>
Jon Spivack9f503a42019-10-22 16:49:19 -070022#include <sys/timerfd.h>
23#include <utils/Looper.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070024#include <utils/StrongPointer.h>
25
26#include "Access.h"
27#include "ServiceManager.h"
28
Steven Moreland80e1e6d2019-06-21 12:35:59 -070029using ::android::Access;
Steven Moreland454bfd92022-07-20 20:53:36 +000030using ::android::IPCThreadState;
Jon Spivack9f503a42019-10-22 16:49:19 -070031using ::android::Looper;
32using ::android::LooperCallback;
33using ::android::ProcessState;
Steven Moreland46f380b2019-10-16 16:28:21 -070034using ::android::ServiceManager;
Steven Moreland46f380b2019-10-16 16:28:21 -070035using ::android::sp;
Steven Moreland454bfd92022-07-20 20:53:36 +000036using ::android::base::SetProperty;
37using ::android::os::IServiceManager;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070038
Jon Spivack9f503a42019-10-22 16:49:19 -070039class BinderCallback : public LooperCallback {
40public:
41 static sp<BinderCallback> setupTo(const sp<Looper>& looper) {
Steven Morelandb0983182021-04-02 03:14:04 +000042 sp<BinderCallback> cb = sp<BinderCallback>::make();
Steven Moreland535f8f92024-01-20 01:55:56 +000043 cb->mLooper = looper;
Jon Spivack9f503a42019-10-22 16:49:19 -070044
Steven Moreland535f8f92024-01-20 01:55:56 +000045 IPCThreadState::self()->setupPolling(&cb->mBinderFd);
46 LOG_ALWAYS_FATAL_IF(cb->mBinderFd < 0, "Failed to setupPolling: %d", cb->mBinderFd);
Jon Spivack9f503a42019-10-22 16:49:19 -070047
Steven Moreland535f8f92024-01-20 01:55:56 +000048 int ret = looper->addFd(cb->mBinderFd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
Jon Spivack9f503a42019-10-22 16:49:19 -070049 nullptr /*data*/);
50 LOG_ALWAYS_FATAL_IF(ret != 1, "Failed to add binder FD to Looper");
51
52 return cb;
53 }
54
55 int handleEvent(int /* fd */, int /* events */, void* /* data */) override {
56 IPCThreadState::self()->handlePolledCommands();
57 return 1; // Continue receiving callbacks.
58 }
Steven Moreland535f8f92024-01-20 01:55:56 +000059
60 void repoll() {
61 if (!mLooper->repoll(mBinderFd)) {
62 ALOGE("Failed to repoll binder FD.");
63 }
64 }
65
66private:
67 sp<Looper> mLooper;
68 int mBinderFd = -1;
Jon Spivack9f503a42019-10-22 16:49:19 -070069};
70
71// LooperCallback for IClientCallback
72class ClientCallbackCallback : public LooperCallback {
73public:
Steven Moreland535f8f92024-01-20 01:55:56 +000074 static sp<ClientCallbackCallback> setupTo(const sp<Looper>& looper,
75 const sp<ServiceManager>& manager,
76 sp<BinderCallback> binderCallback) {
Steven Morelandb0983182021-04-02 03:14:04 +000077 sp<ClientCallbackCallback> cb = sp<ClientCallbackCallback>::make(manager);
Steven Moreland535f8f92024-01-20 01:55:56 +000078 cb->mBinderCallback = binderCallback;
Jon Spivack9f503a42019-10-22 16:49:19 -070079
80 int fdTimer = timerfd_create(CLOCK_MONOTONIC, 0 /*flags*/);
81 LOG_ALWAYS_FATAL_IF(fdTimer < 0, "Failed to timerfd_create: fd: %d err: %d", fdTimer, errno);
82
83 itimerspec timespec {
84 .it_interval = {
85 .tv_sec = 5,
86 .tv_nsec = 0,
87 },
88 .it_value = {
89 .tv_sec = 5,
90 .tv_nsec = 0,
91 },
92 };
93
94 int timeRes = timerfd_settime(fdTimer, 0 /*flags*/, &timespec, nullptr);
95 LOG_ALWAYS_FATAL_IF(timeRes < 0, "Failed to timerfd_settime: res: %d err: %d", timeRes, errno);
96
97 int addRes = looper->addFd(fdTimer,
98 Looper::POLL_CALLBACK,
99 Looper::EVENT_INPUT,
100 cb,
101 nullptr);
102 LOG_ALWAYS_FATAL_IF(addRes != 1, "Failed to add client callback FD to Looper");
103
104 return cb;
105 }
106
107 int handleEvent(int fd, int /*events*/, void* /*data*/) override {
108 uint64_t expirations;
109 int ret = read(fd, &expirations, sizeof(expirations));
110 if (ret != sizeof(expirations)) {
111 ALOGE("Read failed to callback FD: ret: %d err: %d", ret, errno);
112 }
113
114 mManager->handleClientCallbacks();
Steven Moreland535f8f92024-01-20 01:55:56 +0000115 mBinderCallback->repoll(); // b/316829336
116
Jon Spivack9f503a42019-10-22 16:49:19 -0700117 return 1; // Continue receiving callbacks.
118 }
119private:
Steven Morelandb0983182021-04-02 03:14:04 +0000120 friend sp<ClientCallbackCallback>;
Jon Spivack9f503a42019-10-22 16:49:19 -0700121 ClientCallbackCallback(const sp<ServiceManager>& manager) : mManager(manager) {}
122 sp<ServiceManager> mManager;
Steven Moreland535f8f92024-01-20 01:55:56 +0000123 sp<BinderCallback> mBinderCallback;
Jon Spivack9f503a42019-10-22 16:49:19 -0700124};
125
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700126int main(int argc, char** argv) {
Yifan Hong278d81f2021-11-12 19:52:35 -0800127 android::base::InitLogging(argv, android::base::KernelLogger);
Yifan Hong278d81f2021-11-12 19:52:35 -0800128
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700129 if (argc > 2) {
130 LOG(FATAL) << "usage: " << argv[0] << " [binder driver]";
131 }
132
133 const char* driver = argc == 2 ? argv[1] : "/dev/binder";
134
Steven Moreland86cdb082022-07-06 22:30:18 +0000135 LOG(INFO) << "Starting sm instance on " << driver;
136
Steven Moreland1ac84c42019-07-10 17:51:27 -0700137 sp<ProcessState> ps = ProcessState::initWithDriver(driver);
138 ps->setThreadPoolMaxThreadCount(0);
139 ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700140
Steven Moreland310fce22023-08-30 20:57:11 +0000141 IPCThreadState::self()->disableBackgroundScheduling(true);
142
Steven Morelandb0983182021-04-02 03:14:04 +0000143 sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>());
Steven Moreland46f380b2019-10-16 16:28:21 -0700144 if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
145 LOG(ERROR) << "Could not self register servicemanager";
146 }
147
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700148 IPCThreadState::self()->setTheContextObject(manager);
Steven Morelandd98952d2023-05-11 23:27:43 +0000149 if (!ps->becomeContextManager()) {
Steven Moreland601b7952023-05-11 23:29:00 +0000150 LOG(FATAL) << "Could not become context manager";
Steven Morelandd98952d2023-05-11 23:27:43 +0000151 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700152
Jon Spivack9f503a42019-10-22 16:49:19 -0700153 sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);
154
Steven Moreland535f8f92024-01-20 01:55:56 +0000155 sp<BinderCallback> binderCallback = BinderCallback::setupTo(looper);
156 ClientCallbackCallback::setupTo(looper, manager, binderCallback);
Jon Spivack9f503a42019-10-22 16:49:19 -0700157
Steven Moreland454bfd92022-07-20 20:53:36 +0000158#ifndef VENDORSERVICEMANAGER
159 if (!SetProperty("servicemanager.ready", "true")) {
160 LOG(ERROR) << "Failed to set servicemanager ready property";
161 }
162#endif
163
Jon Spivack9f503a42019-10-22 16:49:19 -0700164 while(true) {
165 looper->pollAll(-1);
166 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700167
168 // should not be reached
169 return EXIT_FAILURE;
170}