/* * Copyright (C) 2005 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include // Trusty has its own definition of socket APIs from trusty_ipc.h #ifndef __TRUSTY__ #include #endif // __TRUSTY__ #include #include #include #include namespace android { /** * Service manager for C++ services. * * IInterface is only for legacy ABI compatibility */ class LIBBINDER_EXPORTED IServiceManager : public IInterface { public: // for ABI compatibility virtual const String16& getInterfaceDescriptor() const; IServiceManager(); virtual ~IServiceManager(); /** * Must match values in IServiceManager.aidl */ /* Allows services to dump sections according to priorities. */ static const int DUMP_FLAG_PRIORITY_CRITICAL = 1 << 0; static const int DUMP_FLAG_PRIORITY_HIGH = 1 << 1; static const int DUMP_FLAG_PRIORITY_NORMAL = 1 << 2; /** * Services are by default registered with a DEFAULT dump priority. DEFAULT priority has the * same priority as NORMAL priority but the services are not called with dump priority * arguments. */ static const int DUMP_FLAG_PRIORITY_DEFAULT = 1 << 3; static const int DUMP_FLAG_PRIORITY_ALL = DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PRIORITY_DEFAULT; static const int DUMP_FLAG_PROTO = 1 << 4; /** * Retrieve an existing service, blocking for a few seconds if it doesn't yet exist. This * does polling. A more efficient way to make sure you unblock as soon as the service is * available is to use waitForService or to use service notifications. * * Warning: when using this API, typically, you should call it in a loop. It's dangerous to * assume that nullptr could mean that the service is not available. The service could just * be starting. Generally, whether a service exists, this information should be declared * externally (for instance, an Android feature might imply the existence of a service, * a system property, or in the case of services in the VINTF manifest, it can be checked * with isDeclared). */ [[deprecated("this polls for 5s, prefer waitForService or checkService")]] virtual sp getService(const String16& name) const = 0; /** * Retrieve an existing service, non-blocking. */ virtual sp checkService( const String16& name) const = 0; /** * Register a service. */ // NOLINTNEXTLINE(google-default-arguments) virtual status_t addService(const String16& name, const sp& service, bool allowIsolated = false, int dumpsysFlags = DUMP_FLAG_PRIORITY_DEFAULT) = 0; /** * Return list of all existing services. */ // NOLINTNEXTLINE(google-default-arguments) virtual Vector listServices(int dumpsysFlags = DUMP_FLAG_PRIORITY_ALL) = 0; /** * Efficiently wait for a service. * * Returns nullptr only for permission problem or fatal error. */ virtual sp waitForService(const String16& name) = 0; /** * Check if a service is declared (e.g. VINTF manifest). * * If this returns true, waitForService should always be able to return the * service. */ virtual bool isDeclared(const String16& name) = 0; /** * Get all instances of a service as declared in the VINTF manifest */ virtual Vector getDeclaredInstances(const String16& interface) = 0; /** * If this instance is updatable via an APEX, returns the APEX with which * this can be updated. */ virtual std::optional updatableViaApex(const String16& name) = 0; /** * Returns all instances which are updatable via the APEX. Instance names are fully qualified * like `pack.age.IFoo/default`. */ virtual Vector getUpdatableNames(const String16& apexName) = 0; /** * If this instance has declared remote connection information, returns * the ConnectionInfo. */ struct ConnectionInfo { std::string ipAddress; unsigned int port; }; virtual std::optional getConnectionInfo(const String16& name) = 0; struct LocalRegistrationCallback : public virtual RefBase { virtual void onServiceRegistration(const String16& instance, const sp& binder) = 0; virtual ~LocalRegistrationCallback() {} }; virtual status_t registerForNotifications(const String16& name, const sp& callback) = 0; virtual status_t unregisterForNotifications(const String16& name, const sp& callback) = 0; struct ServiceDebugInfo { std::string name; int pid; }; virtual std::vector getServiceDebugInfo() = 0; /** * Directly enable or disable caching binder during addService calls. * Only used for testing. This is enabled by default. */ virtual void enableAddServiceCache(bool value) = 0; }; LIBBINDER_EXPORTED sp defaultServiceManager(); /** * Directly set the default service manager. Only used for testing. * Note that the caller is responsible for caling this method * *before* any call to defaultServiceManager(); if the latter is * called first, setDefaultServiceManager() will abort. */ LIBBINDER_EXPORTED void setDefaultServiceManager(const sp& sm); template sp waitForService(const String16& name) { const sp sm = defaultServiceManager(); return interface_cast(sm->waitForService(name)); } template sp waitForDeclaredService(const String16& name) { const sp sm = defaultServiceManager(); if (!sm->isDeclared(name)) return nullptr; return interface_cast(sm->waitForService(name)); } template sp checkDeclaredService(const String16& name) { const sp sm = defaultServiceManager(); if (!sm->isDeclared(name)) return nullptr; return interface_cast(sm->checkService(name)); } template sp waitForVintfService( const String16& instance = String16("default")) { return waitForDeclaredService( INTERFACE::descriptor + String16("/") + instance); } template sp checkVintfService( const String16& instance = String16("default")) { return checkDeclaredService( INTERFACE::descriptor + String16("/") + instance); } template status_t getService(const String16& name, sp* outService) { const sp sm = defaultServiceManager(); if (sm != nullptr) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" *outService = interface_cast(sm->getService(name)); #pragma clang diagnostic pop // getService deprecation if ((*outService) != nullptr) return NO_ERROR; } return NAME_NOT_FOUND; } LIBBINDER_EXPORTED void* openDeclaredPassthroughHal(const String16& interface, const String16& instance, int flag); LIBBINDER_EXPORTED bool checkCallingPermission(const String16& permission); LIBBINDER_EXPORTED bool checkCallingPermission(const String16& permission, int32_t* outPid, int32_t* outUid); LIBBINDER_EXPORTED bool checkPermission(const String16& permission, pid_t pid, uid_t uid, bool logPermissionFailure = true); // ---------------------------------------------------------------------- // Trusty's definition of the socket APIs does not include sockaddr types #ifndef __TRUSTY__ typedef std::function RpcSocketAddressProvider; /** * This callback provides a way for clients to get access to remote services by * providing an Accessor object from libbinder that can connect to the remote * service over sockets. * * \param instance name of the service that the callback will provide an * Accessor for. The provided accessor will be used to set up a client * RPC connection in libbinder in order to return a binder for the * associated remote service. * * \return IBinder of the Accessor object that libbinder implements. * nullptr if the provider callback doesn't know how to reach the * service or doesn't want to provide access for any other reason. */ typedef std::function(const String16& instance)> RpcAccessorProvider; class AccessorProvider; /** * Register a RpcAccessorProvider for the service manager APIs. * * \param instances that the RpcAccessorProvider knows about and can provide an * Accessor for. * \param provider callback that generates Accessors. * * \return A pointer used as a recept for the successful addition of the * AccessorProvider. This is needed to unregister it later. */ [[nodiscard]] LIBBINDER_EXPORTED std::weak_ptr addAccessorProvider( std::set&& instances, RpcAccessorProvider&& providerCallback); /** * Remove an accessor provider using the pointer provided by addAccessorProvider * along with the cookie pointer that was used. * * \param provider cookie that was returned by addAccessorProvider to keep track * of this instance. */ [[nodiscard]] LIBBINDER_EXPORTED status_t removeAccessorProvider(std::weak_ptr provider); /** * Create an Accessor associated with a service that can create a socket connection based * on the connection info from the supplied RpcSocketAddressProvider. * * \param instance name of the service that this Accessor is associated with * \param connectionInfoProvider a callback that returns connection info for * connecting to the service. * \return the binder of the IAccessor implementation from libbinder */ LIBBINDER_EXPORTED sp createAccessor(const String16& instance, RpcSocketAddressProvider&& connectionInfoProvider); /** * Check to make sure this binder is the expected binder that is an IAccessor * associated with a specific instance. * * This helper function exists to avoid adding the IAccessor type to * libbinder_ndk. * * \param instance name of the service that this Accessor should be associated with * \param binder to validate * * \return OK if the binder is an IAccessor for `instance` */ LIBBINDER_EXPORTED status_t validateAccessor(const String16& instance, const sp& binder); /** * Have libbinder wrap this IAccessor binder in an IAccessorDelegator and return * it. * * This is required only in very specific situations when the process that has * permissions to connect the to RPC service's socket and create the FD for it * is in a separate process from this process that wants to service the Accessor * binder and the communication between these two processes is binder RPC. This * is needed because the binder passed over the binder RPC connection can not be * used as a kernel binder, and needs to be wrapped by a kernel binder that can * then be registered with service manager. * * \param instance name of the Accessor. * \param binder to wrap in a Delegator and register with service manager. * \param outDelegator the wrapped kernel binder for IAccessorDelegator * * \return OK if the binder is an IAccessor for `instance` and the delegator was * successfully created. */ LIBBINDER_EXPORTED status_t delegateAccessor(const String16& name, const sp& accessor, sp* delegator); #endif // __TRUSTY__ #ifndef __ANDROID__ // Create an IServiceManager that delegates the service manager on the device via adb. // This is can be set as the default service manager at program start, so that // defaultServiceManager() returns it: // int main() { // setDefaultServiceManager(createRpcDelegateServiceManager()); // auto sm = defaultServiceManager(); // // ... // } // Resources are cleaned up when the object is destroyed. // // For each returned binder object, at most |maxOutgoingConnections| outgoing connections are // instantiated, depending on how many the service on the device is configured with. // Hence, only |maxOutgoingConnections| calls can be made simultaneously. // See also RpcSession::setMaxOutgoingConnections. struct RpcDelegateServiceManagerOptions { std::optional maxOutgoingConnections; }; LIBBINDER_EXPORTED sp createRpcDelegateServiceManager( const RpcDelegateServiceManagerOptions& options); #endif } // namespace android