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

Commit 090b593a authored by Justin Yun's avatar Justin Yun Committed by Yifan Hong
Browse files

Make libvndksupport look for default namespace as well.

In vendor process, libvndksupport must look for "default" namespace,
instead of "sphal" namespace to open hal libraries.

Bug: 63411330
Test: Boot the device.
Change-Id: I26208b6f47708f83e0679fd72ca7471ade84fff9
Merged-In: I26208b6f47708f83e0679fd72ca7471ade84fff9
parent a34bd056
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -23,23 +23,38 @@

extern struct android_namespace_t* android_get_exported_namespace(const char*);

static const char* namespace_name = NULL;

static struct android_namespace_t* get_vendor_namespace() {
    const char* namespace_names[] = {"sphal", "default", NULL};
    static struct android_namespace_t* vendor_namespace = NULL;
    if (vendor_namespace == NULL) {
        int name_idx = 0;
        while (namespace_names[name_idx] != NULL) {
            vendor_namespace = android_get_exported_namespace(namespace_names[name_idx]);
            if (vendor_namespace != NULL) {
                namespace_name = namespace_names[name_idx];
                break;
            }
            name_idx++;
        }
    }
    return vendor_namespace;
}

void* android_load_sphal_library(const char* name, int flag) {
    struct android_namespace_t* sphal_namespace = android_get_exported_namespace("sphal");
    if (sphal_namespace != NULL) {
    struct android_namespace_t* vendor_namespace = get_vendor_namespace();
    if (vendor_namespace != NULL) {
        const android_dlextinfo dlextinfo = {
            .flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = sphal_namespace,
            .flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = vendor_namespace,
        };
        void* handle = android_dlopen_ext(name, flag, &dlextinfo);
        if (!handle) {
            ALOGE(
                "Could not load %s from sphal namespace: %s.",
                name, dlerror());
            ALOGE("Could not load %s from %s namespace: %s.", name, namespace_name, dlerror());
        }
        return handle;
    } else {
        ALOGD(
            "Loading %s from current namespace instead of sphal namespace.",
            name);
        ALOGD("Loading %s from current namespace instead of sphal namespace.", name);
        return dlopen(name, flag);
    }
}