-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhookril.c
227 lines (186 loc) · 7.06 KB
/
hookril.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
//#define MTK_RIL
#define LIB_PATH_PROPERTY_NEW "rild.libpath"
#define LIB_PATH_PROPERTY_ORIG "rild.libpath_orig"
#include "telephony/ril.h"
#include <dlfcn.h>
#include <string.h>
#include <sys/system_properties.h>
#include <stdlib.h>
#include "logger.h"
#include "transmitter.h"
void inner_RIL_RequestFunc(int request, void *data, size_t datalen, RIL_Token t);
RIL_RadioState inner_RIL_RadioStateRequest(
#ifdef MTK_RIL
RILId rid, int *sim_status
#endif
);
void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, size_t datalen
#ifdef MTK_RIL
, RILId id
#endif
);
void RIL_onRequestTimedCallback(RIL_TimedCallback callback, void *param, const struct timeval *relativeTime);
#ifdef MTK_RIL
void RIL_onRequestProxyTimedCallback(RIL_TimedCallback callback, void *param, const struct timeval *relativeTime, int proxyId);
RILChannelId RIL_onQueryMyChannelId(RIL_Token t);
int RIL_onQueryMyProxyIdByThread();
#endif
struct RIL_Env orig_RIL_Env;
RIL_RadioFunctions orig_RIL_RadioFunctions;
//RIL_RequestFunc orig_RIL_RequestFunc;
//RIL_RadioStateRequest orig_RIL_RadioStateRequest;
struct RIL_Env s_rilEnv = {
RIL_onRequestComplete,
RIL_onUnsolicitedResponse,
RIL_onRequestTimedCallback
#ifdef MTK_RIL
, RIL_onRequestProxyTimedCallback,
RIL_onQueryMyChannelId,
RIL_onQueryMyProxyIdByThread
#endif
};
RIL_RadioFunctions base_RIL_RadioFunctions;
//const char* (*requestToString)(int request);
/**************************** Lib functions ****************************/
const RIL_RadioFunctions* RIL_Init(const struct RIL_Env *env, int argc, char **argv) {
char rilLibPath[PROP_VALUE_MAX];
SLOGD("Start hookril init\n");
if ( 0 == __system_property_get(LIB_PATH_PROPERTY_ORIG, rilLibPath)) {
SLOGE("No vendor so");
return NULL;
}
void* dlHandle = dlopen(rilLibPath, RTLD_NOW);
if (dlHandle == NULL) {
LOGE("dlopen failed: %s", dlerror());
return NULL;
}
SLOGD("Try to find vendor library init function");
const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **);
rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");
if (rilInit == NULL) {
LOGE("RIL_Init not defined or exported in %s", rilLibPath);
return NULL;
}
SLOGD("Vendor library init function found");
memcpy(&orig_RIL_Env, env, sizeof(struct RIL_Env));
SLOGD("Try to call vendor library init function");
const RIL_RadioFunctions *funcs;
funcs = rilInit(&s_rilEnv, argc, argv);
if(funcs == NULL) {
SLOGE("RIL_Init vendor function call error");
return NULL;
}
SLOGD("Vendor library init function pass");
//#ifdef MTK_RIL
// void* librilmtkHandle = dlopen("/system/lib/librilmtk.so", RTLD_NOW);
// requestToString = (const char* (*)(int))dlsym(librilmtkHandle, "requestToString");
//#else
// void* librilmtkHandle = dlopen("/system/lib/libril.so", RTLD_NOW);
// requestToString = (const char* (*)(int))dlsym(librilmtkHandle, "requestToString");
//#endif
// if(requestToString == NULL) {
// LOGE("requestToString function symbol looking error");
// return NULL;
// }
if(initSocket() != 0) {
SLOGE("Transmitter initializations fail");
return NULL;
}
memcpy(&orig_RIL_RadioFunctions, funcs, sizeof(RIL_RadioFunctions));
memcpy(&base_RIL_RadioFunctions, &orig_RIL_RadioFunctions, sizeof(RIL_RadioFunctions));
base_RIL_RadioFunctions.onRequest = &inner_RIL_RequestFunc;
base_RIL_RadioFunctions.onStateRequest = &inner_RIL_RadioStateRequest;
return &base_RIL_RadioFunctions;
}
/**************************** Base functions ****************************/
void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
SLOGD("Entered to RIL_onRequestComplete.");
orig_RIL_Env.OnRequestComplete(t, e, response, responselen);
if(!isTransmittionActive())
return;
int32_t token = *(int32_t*)t;
TransData* transData = malloc(sizeof(TransDataHeader) + responselen);
transData->header.funcIdentifier = 2;
transData->header.command = -1;
transData->header.token = token;
transData->header.datalen = responselen;
memcpy(transData->data, response, responselen);
putNextData(transData);
}
void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, size_t datalen
#ifdef MTK_RIL
, RILId id
#endif
) {
SLOGD("Entered to RIL_onUnsolicitedResponse.");
orig_RIL_Env.OnUnsolicitedResponse(unsolResponse, data, datalen
#ifdef MTK_RIL
, id
#endif
);
if(!isTransmittionActive())
return;
TransData* transData = malloc(sizeof(TransDataHeader) + datalen);
transData->header.funcIdentifier = 3;
transData->header.command = unsolResponse;
transData->header.token = -1;
transData->header.datalen = datalen;
memcpy(transData->data, data, datalen);
putNextData(transData);
}
void RIL_onRequestTimedCallback(RIL_TimedCallback callback, void *param, const struct timeval *relativeTime) {
SLOGD("Entered to RIL_requestTimedCallback.");
orig_RIL_Env.RequestTimedCallback(callback, param, relativeTime);
}
#ifdef MTK_RIL
void RIL_onRequestProxyTimedCallback(RIL_TimedCallback callback, void *param, const struct timeval *relativeTime, int proxyId) {
sLOGD("Entered to RIL_onRequestProxyTimedCallback.");
orig_RIL_Env.RequestProxyTimedCallback(callback, param, relativeTime, proxyId);
}
RILChannelId RIL_onQueryMyChannelId(RIL_Token t) {
sLOGD("Entered to RIL_onQueryMyChannelId.");
return orig_RIL_Env.QueryMyChannelId(t);
}
int RIL_onQueryMyProxyIdByThread() {
sLOGD("Entered to RIL_onQueryMyProxyIdByThread.");
return orig_RIL_Env.QueryMyProxyIdByThread();
}
#endif
/**************************** Vendor functions ****************************/
void inner_RIL_RequestFunc(int request, void *data, size_t datalen, RIL_Token t) {
SLOGD("Entered to RIL_RequestFunc.");
orig_RIL_RadioFunctions.onRequest(request, data, datalen, t);
if(!isTransmittionActive())
return;
int32_t token = *(int32_t*)t;
TransData* transData = malloc(sizeof(TransDataHeader) + datalen);
transData->header.funcIdentifier = 1;
transData->header.command = request;
transData->header.token = token;
transData->header.datalen = datalen;
memcpy(transData->data, data, datalen);
putNextData(transData);
}
RIL_RadioState inner_RIL_RadioStateRequest(
#ifdef MTK_RIL
RILId rid, int *sim_status
#endif
) {
RIL_RadioState state = orig_RIL_RadioFunctions.onStateRequest(
#ifdef MTK_RIL
rid, sim_status
#endif
);
LOGD("Entered to RIL_RadioStateRequest. State is %d", state);
if(!isTransmittionActive())
return state;
int32_t token = state;
TransData* transData = malloc(sizeof(TransDataHeader));
transData->header.funcIdentifier = 4;
transData->header.command = -1;
transData->header.token = token;
transData->header.datalen = 0;
putNextData(transData);
return state;
}