1 /*
2 * Copyright (C) 2005 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 #define LOG_TAG "ServiceManager"
18
19 #include <binder/IServiceManager.h>
20
21 #include <utils/Log.h>
22 #include <binder/IPCThreadState.h>
23 #include <binder/Parcel.h>
24 #include <utils/String8.h>
25 #include <utils/SystemClock.h>
26
27 #include <private/binder/Static.h>
28
29 #include <unistd.h>
30
31 namespace android {
32
defaultServiceManager()33 sp<IServiceManager> defaultServiceManager()
34 {
35 if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
36
37 {
38 AutoMutex _l(gDefaultServiceManagerLock);
39 while (gDefaultServiceManager == NULL) {
40 gDefaultServiceManager = interface_cast<IServiceManager>(
41 ProcessState::self()->getContextObject(NULL));
42 if (gDefaultServiceManager == NULL)
43 sleep(1);
44 }
45 }
46
47 return gDefaultServiceManager;
48 }
49
checkCallingPermission(const String16 & permission)50 bool checkCallingPermission(const String16& permission)
51 {
52 return checkCallingPermission(permission, NULL, NULL);
53 }
54
55 static String16 _permission("permission");
56
57
checkCallingPermission(const String16 & permission,int32_t * outPid,int32_t * outUid)58 bool checkCallingPermission(const String16& permission, int32_t* outPid, int32_t* outUid)
59 {
60 IPCThreadState* ipcState = IPCThreadState::self();
61 pid_t pid = ipcState->getCallingPid();
62 uid_t uid = ipcState->getCallingUid();
63 if (outPid) *outPid = pid;
64 if (outUid) *outUid = uid;
65 return checkPermission(permission, pid, uid);
66 }
67
checkPermission(const String16 & permission,pid_t pid,uid_t uid)68 bool checkPermission(const String16& permission, pid_t pid, uid_t uid)
69 {
70 sp<IPermissionController> pc;
71 gDefaultServiceManagerLock.lock();
72 pc = gPermissionController;
73 gDefaultServiceManagerLock.unlock();
74
75 int64_t startTime = 0;
76
77 while (true) {
78 if (pc != NULL) {
79 bool res = pc->checkPermission(permission, pid, uid);
80 if (res) {
81 if (startTime != 0) {
82 ALOGI("Check passed after %d seconds for %s from uid=%d pid=%d",
83 (int)((uptimeMillis()-startTime)/1000),
84 String8(permission).string(), uid, pid);
85 }
86 return res;
87 }
88
89 // Is this a permission failure, or did the controller go away?
90 if (pc->asBinder()->isBinderAlive()) {
91 ALOGW("Permission failure: %s from uid=%d pid=%d",
92 String8(permission).string(), uid, pid);
93 return false;
94 }
95
96 // Object is dead!
97 gDefaultServiceManagerLock.lock();
98 if (gPermissionController == pc) {
99 gPermissionController = NULL;
100 }
101 gDefaultServiceManagerLock.unlock();
102 }
103
104 // Need to retrieve the permission controller.
105 sp<IBinder> binder = defaultServiceManager()->checkService(_permission);
106 if (binder == NULL) {
107 // Wait for the permission controller to come back...
108 if (startTime == 0) {
109 startTime = uptimeMillis();
110 ALOGI("Waiting to check permission %s from uid=%d pid=%d",
111 String8(permission).string(), uid, pid);
112 }
113 sleep(1);
114 } else {
115 pc = interface_cast<IPermissionController>(binder);
116 // Install the new permission controller, and try again.
117 gDefaultServiceManagerLock.lock();
118 gPermissionController = pc;
119 gDefaultServiceManagerLock.unlock();
120 }
121 }
122 }
123
124 // ----------------------------------------------------------------------
125
126 class BpServiceManager : public BpInterface<IServiceManager>
127 {
128 public:
BpServiceManager(const sp<IBinder> & impl)129 BpServiceManager(const sp<IBinder>& impl)
130 : BpInterface<IServiceManager>(impl)
131 {
132 }
133
getService(const String16 & name) const134 virtual sp<IBinder> getService(const String16& name) const
135 {
136 unsigned n;
137 for (n = 0; n < 5; n++){
138 sp<IBinder> svc = checkService(name);
139 if (svc != NULL) return svc;
140 ALOGI("Waiting for service %s...\n", String8(name).string());
141 sleep(1);
142 }
143 return NULL;
144 }
145
checkService(const String16 & name) const146 virtual sp<IBinder> checkService( const String16& name) const
147 {
148 Parcel data, reply;
149 data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
150 data.writeString16(name);
151 remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
152 return reply.readStrongBinder();
153 }
154
addService(const String16 & name,const sp<IBinder> & service,bool allowIsolated)155 virtual status_t addService(const String16& name, const sp<IBinder>& service,
156 bool allowIsolated)
157 {
158 Parcel data, reply;
159 data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
160 data.writeString16(name);
161 data.writeStrongBinder(service);
162 data.writeInt32(allowIsolated ? 1 : 0);
163 status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
164 return err == NO_ERROR ? reply.readExceptionCode() : err;
165 }
166
listServices()167 virtual Vector<String16> listServices()
168 {
169 Vector<String16> res;
170 int n = 0;
171
172 for (;;) {
173 Parcel data, reply;
174 data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
175 data.writeInt32(n++);
176 status_t err = remote()->transact(LIST_SERVICES_TRANSACTION, data, &reply);
177 if (err != NO_ERROR)
178 break;
179 res.add(reply.readString16());
180 }
181 return res;
182 }
183 };
184
185 IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
186
187 // ----------------------------------------------------------------------
188
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)189 status_t BnServiceManager::onTransact(
190 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
191 {
192 //printf("ServiceManager received: "); data.print();
193 switch(code) {
194 case GET_SERVICE_TRANSACTION: {
195 CHECK_INTERFACE(IServiceManager, data, reply);
196 String16 which = data.readString16();
197 sp<IBinder> b = const_cast<BnServiceManager*>(this)->getService(which);
198 reply->writeStrongBinder(b);
199 return NO_ERROR;
200 } break;
201 case CHECK_SERVICE_TRANSACTION: {
202 CHECK_INTERFACE(IServiceManager, data, reply);
203 String16 which = data.readString16();
204 sp<IBinder> b = const_cast<BnServiceManager*>(this)->checkService(which);
205 reply->writeStrongBinder(b);
206 return NO_ERROR;
207 } break;
208 case ADD_SERVICE_TRANSACTION: {
209 CHECK_INTERFACE(IServiceManager, data, reply);
210 String16 which = data.readString16();
211 sp<IBinder> b = data.readStrongBinder();
212 status_t err = addService(which, b);
213 reply->writeInt32(err);
214 return NO_ERROR;
215 } break;
216 case LIST_SERVICES_TRANSACTION: {
217 CHECK_INTERFACE(IServiceManager, data, reply);
218 Vector<String16> list = listServices();
219 const size_t N = list.size();
220 reply->writeInt32(N);
221 for (size_t i=0; i<N; i++) {
222 reply->writeString16(list[i]);
223 }
224 return NO_ERROR;
225 } break;
226 default:
227 return BBinder::onTransact(code, data, reply, flags);
228 }
229 }
230
231 }; // namespace android
232