IServiceManager.cpp revision 6456e4488d59c0568a1f29dc93b7beb472236086
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 31namespace android { 32 33sp<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 50bool checkCallingPermission(const String16& permission) 51{ 52 return checkCallingPermission(permission, NULL, NULL); 53} 54 55static String16 _permission("permission"); 56 57 58bool 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 68bool 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 (IInterface::asBinder(pc)->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 126class BpServiceManager : public BpInterface<IServiceManager> 127{ 128public: 129 explicit BpServiceManager(const sp<IBinder>& impl) 130 : BpInterface<IServiceManager>(impl) 131 { 132 } 133 134 virtual sp<IBinder> getService(const String16& name) const 135 { 136 unsigned n; 137 for (n = 0; n < 5; n++){ 138 if (n > 0) { 139 ALOGI("Waiting for service %s...", String8(name).string()); 140 sleep(1); 141 } 142 sp<IBinder> svc = checkService(name); 143 if (svc != NULL) return svc; 144 } 145 return NULL; 146 } 147 148 virtual sp<IBinder> checkService( const String16& name) const 149 { 150 Parcel data, reply; 151 data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 152 data.writeString16(name); 153 remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply); 154 return reply.readStrongBinder(); 155 } 156 157 virtual status_t addService(const String16& name, const sp<IBinder>& service, 158 bool allowIsolated) 159 { 160 Parcel data, reply; 161 data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 162 data.writeString16(name); 163 data.writeStrongBinder(service); 164 data.writeInt32(allowIsolated ? 1 : 0); 165 status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply); 166 return err == NO_ERROR ? reply.readExceptionCode() : err; 167 } 168 169 virtual Vector<String16> listServices() 170 { 171 Vector<String16> res; 172 int n = 0; 173 174 for (;;) { 175 Parcel data, reply; 176 data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 177 data.writeInt32(n++); 178 status_t err = remote()->transact(LIST_SERVICES_TRANSACTION, data, &reply); 179 if (err != NO_ERROR) 180 break; 181 res.add(reply.readString16()); 182 } 183 return res; 184 } 185}; 186 187IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager"); 188 189}; // namespace android 190