Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2ace387 authored by dimitry's avatar dimitry
Browse files

Add getExportedNamespace NB callback

This callback replaces getVendorNamespace(). Fix nativeloader
to use NativeBridgeGetExportedNamespace instead of
NativeBridgeGetVendorNamespace.

Bug: http://b/121248172
Bug: http://b/121372395
Test: make
Change-Id: I8fa2081e37815f6f65490c9536bed0687b7f1e77
parent faa6c489
Loading
Loading
Loading
Loading
+13 −2
Original line number Original line Diff line number Diff line
@@ -164,8 +164,9 @@ bool NativeBridgeLinkNamespaces(struct native_bridge_namespace_t* from,
void* NativeBridgeLoadLibraryExt(const char* libpath, int flag,
void* NativeBridgeLoadLibraryExt(const char* libpath, int flag,
                                 struct native_bridge_namespace_t* ns);
                                 struct native_bridge_namespace_t* ns);


// Returns vendor namespace if it is enabled for the device and null otherwise
// Returns exported namespace by the name. This is a reflection of
struct native_bridge_namespace_t* NativeBridgeGetVendorNamespace();
// android_get_exported_namespace function. Introduced in v5.
struct native_bridge_namespace_t* NativeBridgeGetExportedNamespace(const char* name);


// Native bridge interfaces to runtime.
// Native bridge interfaces to runtime.
struct NativeBridgeCallbacks {
struct NativeBridgeCallbacks {
@@ -362,7 +363,17 @@ struct NativeBridgeCallbacks {
  //
  //
  // Returns:
  // Returns:
  //   vendor namespace or null if it was not set up for the device
  //   vendor namespace or null if it was not set up for the device
  //
  // Starting with v5 (Android Q) this function is no longer used.
  // Use getExportedNamespace() below.
  struct native_bridge_namespace_t* (*getVendorNamespace)();
  struct native_bridge_namespace_t* (*getVendorNamespace)();

  // Get native bridge version of exported namespace. Peer of
  // android_get_exported_namespace(const char*) function.
  //
  // Returns:
  //   exported namespace or null if it was not set up for the device
  struct native_bridge_namespace_t* (*getExportedNamespace)(const char* name);
};
};


// Runtime interfaces to native bridge.
// Runtime interfaces to native bridge.
+1 −1
Original line number Original line Diff line number Diff line
@@ -24,7 +24,7 @@ LIBNATIVEBRIDGE_1 {
    NativeBridgeGetError;
    NativeBridgeGetError;
    NativeBridgeIsPathSupported;
    NativeBridgeIsPathSupported;
    NativeBridgeCreateNamespace;
    NativeBridgeCreateNamespace;
    NativeBridgeGetVendorNamespace;
    NativeBridgeGetExportedNamespace;
    NativeBridgeLinkNamespaces;
    NativeBridgeLinkNamespaces;
    NativeBridgeLoadLibraryExt;
    NativeBridgeLoadLibraryExt;
    NativeBridgeInitAnonymousNamespace;
    NativeBridgeInitAnonymousNamespace;
+15 −3
Original line number Original line Diff line number Diff line
@@ -101,6 +101,8 @@ enum NativeBridgeImplementationVersion {
  NAMESPACE_VERSION = 3,
  NAMESPACE_VERSION = 3,
  // The version with vendor namespaces
  // The version with vendor namespaces
  VENDOR_NAMESPACE_VERSION = 4,
  VENDOR_NAMESPACE_VERSION = 4,
  // The version with runtime namespaces
  RUNTIME_NAMESPACE_VERSION = 5,
};
};


// Whether we had an error at some point.
// Whether we had an error at some point.
@@ -610,14 +612,24 @@ bool NativeBridgeLinkNamespaces(native_bridge_namespace_t* from, native_bridge_n
  return false;
  return false;
}
}


native_bridge_namespace_t* NativeBridgeGetVendorNamespace() {
native_bridge_namespace_t* NativeBridgeGetExportedNamespace(const char* name) {
  if (!NativeBridgeInitialized() || !isCompatibleWith(VENDOR_NAMESPACE_VERSION)) {
  if (!NativeBridgeInitialized()) {
    return nullptr;
    return nullptr;
  }
  }


  if (isCompatibleWith(RUNTIME_NAMESPACE_VERSION)) {
    return callbacks->getExportedNamespace(name);
  }

  // sphal is vendor namespace name -> use v4 callback in the case NB callbacks
  // are not compatible with v5
  if (isCompatibleWith(VENDOR_NAMESPACE_VERSION) && name != nullptr && strcmp("sphal", name) == 0) {
    return callbacks->getVendorNamespace();
    return callbacks->getVendorNamespace();
  }
  }


  return nullptr;
}

void* NativeBridgeLoadLibraryExt(const char* libpath, int flag, native_bridge_namespace_t* ns) {
void* NativeBridgeLoadLibraryExt(const char* libpath, int flag, native_bridge_namespace_t* ns) {
  if (NativeBridgeInitialized()) {
  if (NativeBridgeInitialized()) {
    if (isCompatibleWith(NAMESPACE_VERSION)) {
    if (isCompatibleWith(NAMESPACE_VERSION)) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -300,7 +300,7 @@ class LibraryNamespaces {
        return nullptr;
        return nullptr;
      }
      }


      native_bridge_namespace_t* vendor_ns = NativeBridgeGetVendorNamespace();
      native_bridge_namespace_t* vendor_ns = NativeBridgeGetExportedNamespace(kVendorNamespaceName);


      if (!NativeBridgeLinkNamespaces(ns, nullptr, system_exposed_libraries.c_str())) {
      if (!NativeBridgeLinkNamespaces(ns, nullptr, system_exposed_libraries.c_str())) {
        *error_msg = NativeBridgeGetError();
        *error_msg = NativeBridgeGetError();