#define LOG_TAG "RilWrapper" #define RIL_SHLIB #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define REAL_RIL_NAME "/system/lib/libsec-ril.so" static RIL_RadioFunctions const *mRealRadioFuncs; static const struct RIL_Env *mEnv; static void rilOnRequest(int request, void *data, size_t datalen, RIL_Token t) { switch (request) { case RIL_REQUEST_GET_RADIO_CAPABILITY: RLOGW("Returning NOT_SUPPORTED on GET_RADIO_CAPABILITY"); mEnv->OnRequestComplete(t, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0); break; default: mRealRadioFuncs->onRequest(request, data, datalen, t); } } const RIL_RadioFunctions* RIL_Init(const struct RIL_Env *env, int argc, char **argv) { RIL_RadioFunctions const* (*fRealRilInit)(const struct RIL_Env *env, int argc, char **argv); static RIL_RadioFunctions rilInfo; void *realRilLibHandle; int i; //save the env; mEnv = env; //get the real RIL realRilLibHandle = dlopen(REAL_RIL_NAME, RTLD_LOCAL); if (!realRilLibHandle) { RLOGE("Failed to load the real RIL '" REAL_RIL_NAME "': %s\n", dlerror()); return NULL; } //remove "-c" command line as Samsung's RIL does not understand it - it just barfs instead for (i = 0; i < argc; i++) { if (!strcmp(argv[i], "-c") && i != argc -1) { //found it memcpy(argv + i, argv + i + 2, sizeof(char*[argc - i - 2])); argc -= 2; } } //load the real RIL fRealRilInit = dlsym(realRilLibHandle, "RIL_Init"); if (!fRealRilInit) { RLOGE("Failed to find the real RIL's entry point\n"); goto out_fail; } RLOGD("Calling the real RIL's entry point with %u args\n", argc); for (i = 0; i < argc; i++) RLOGD(" argv[%2d] = '%s'\n", i, argv[i]); //try to init the real ril mRealRadioFuncs = fRealRilInit(env, argc, argv); if (!mRealRadioFuncs) { RLOGE("The real RIL's entry point failed\n"); goto out_fail; } //copy the real RIL's info struct, then replace the onRequest pointer with our own rilInfo = *mRealRadioFuncs; rilInfo.onRequest = rilOnRequest; RLOGD("Wrapped RIL version is '%s'\n", mRealRadioFuncs->getVersion()); //we're all good - return to caller return &rilInfo; out_fail: dlclose(realRilLibHandle); return NULL; }