-
Notifications
You must be signed in to change notification settings - Fork 0
/
rilwrap.c
163 lines (131 loc) · 4.73 KB
/
rilwrap.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
#define LOG_NDEBUG 0
#define LOG_TAG "RILWrap"
#include <dlfcn.h>
#include <cutils/properties.h>
#include <telephony/ril.h>
#include <utils/Log.h>
#include "rilwrap.h"
#include "rilthreads.h"
#include "multicast.h"
/* Wrapped RIL_env functions */
void (*OnRequestComplete_wrapee) (RIL_Token, RIL_Errno, void *, size_t);
void (*OnUnsolicitedResponse_wrapee) (int, const void *, size_t);
void (*RequestTimedCallback_wrapee) (RIL_TimedCallback, void *, const struct timeval *);
/* RIL_env wrappers */
void OnRequestComplete_wrapper (RIL_Token t, RIL_Errno e,
void *response, size_t responselen)
{
/* Debug code */
RequestInfo *pRI = (RequestInfo *)t;
LOGV("OnRequestComplete token='%u' errno='%u' responselen='%u'",
pRI->token, e, responselen);
/* Call the orig function */
OnRequestComplete_wrapee(t, e, response, responselen);
}
void OnUnsolicitedResponse_wrapper (int unsolResponse, const void *data,
size_t datalen)
{
/* Debug code */
LOGV("OnUnsolicitedResponse unsolResponse='%d' datalen='%u'",
unsolResponse, datalen);
/* Call the orig function */
OnUnsolicitedResponse_wrapee(unsolResponse, data, datalen);
}
void RequestTimedCallback_wrapper (RIL_TimedCallback callback,
void *param, const struct timeval *relativeTime)
{
/* Debug code */
LOGV("RequestTimedCallback relativeTime='%lu'",
(relativeTime->tv_sec * 1000) + (relativeTime->tv_usec / 1000));
/* Call the orig function */
RequestTimedCallback_wrapee(callback, param, relativeTime);
}
/* Wrapped RIL_RadioFunctions functions */
RIL_RequestFunc RIL_RequestFunc_wrapee;
RIL_RadioStateRequest RIL_RadioStateRequest_wrapee;
RIL_Supports RIL_Supports_wrapee;
RIL_Cancel RIL_Cancel_wrapee;
RIL_GetVersion RIL_GetVersion_wrapee;
/* RIL_RadioFunctions wrappers */
void RIL_RequestFunc_wrapper (int request, void *data, size_t datalen, RIL_Token t)
{
/* Debug code */
RequestInfo *pRI = (RequestInfo *)t;
LOGV("RIL_RequestFunc request='%d' datalen='%u' token='%u'",
request, datalen, pRI->token);
/* Call the orig function */
RIL_RequestFunc_wrapee(request, data, datalen, t);
}
RIL_RadioState RIL_RadioStateRequest_wrapper (int argc, char *argv[])
{
/* Debug code */
LOGV("RIL_RadioStateRequest");
/* Call the orig function */
return RIL_RadioStateRequest_wrapee(argc, argv);
}
int RIL_Supports_wrapper (int requestCode)
{
/* Debug code */
LOGV("RIL_Supports requestCode='%d'", requestCode);
/* Call the orig function */
return RIL_Supports_wrapee(requestCode);
}
void RIL_Cancel_wrapper (RIL_Token t)
{
/* Debug code */
RequestInfo *pRI = (RequestInfo *)t;
LOGV("RIL_Cancel token='%d'", pRI->token);
/* Call the orig function */
return RIL_Cancel_wrapee(t);
}
const char * RIL_GetVersion_wrapper (void)
{
LOGV("RIL_GetVersion");
/* Call the orig function */
return RIL_GetVersion_wrapee();
}
RIL_RadioFunctions *RIL_RadioFunctions_orig;
RIL_RadioFunctions RIL_RadioFunctions_wrap;
struct RIL_Env RIL_Env_wrap;
/* Main function - magic happens here! */
const RIL_RadioFunctions *RIL_Init (const struct RIL_Env *env, int argc, char **argv)
{
void *handle;
RIL_RadioFunctions *(*RIL_Init_wrap)(const struct RIL_Env *, int, char **);
char wraplib[PROPERTY_VALUE_MAX];
/* Read lib path */
property_get("rild.wraplib", wraplib, "none");
handle = dlopen(wraplib, RTLD_NOW);
if (!handle) {
exit(1);
}
RIL_Init_wrap = dlsym(handle, "RIL_Init");
if (dlerror() != NULL)
exit(2);
/* Set up wrapees */
OnRequestComplete_wrapee = env->OnRequestComplete;
OnUnsolicitedResponse_wrapee = env->OnUnsolicitedResponse;
RequestTimedCallback_wrapee = env->RequestTimedCallback;
/* Set up new env to pass to RIL */
RIL_Env_wrap.OnRequestComplete = OnRequestComplete_wrapper;
RIL_Env_wrap.OnUnsolicitedResponse = OnUnsolicitedResponse_wrapper;
RIL_Env_wrap.RequestTimedCallback = RequestTimedCallback_wrapper;
RIL_RadioFunctions_orig = RIL_Init_wrap(&RIL_Env_wrap, argc, argv);
/* Set up RadioFunctions wrapees */
RIL_RequestFunc_wrapee = RIL_RadioFunctions_orig->onRequest;
RIL_RadioStateRequest_wrapee = RIL_RadioFunctions_orig->onStateRequest;
RIL_Supports_wrapee = RIL_RadioFunctions_orig->supports;
RIL_Cancel_wrapee = RIL_RadioFunctions_orig->onCancel;
RIL_GetVersion_wrapee = RIL_RadioFunctions_orig->getVersion;
/* Set up new RadioFunctions to return */
RIL_RadioFunctions_wrap.version = RIL_RadioFunctions_orig->version;
RIL_RadioFunctions_wrap.onRequest = RIL_RequestFunc_wrapper;
RIL_RadioFunctions_wrap.onStateRequest = RIL_RadioStateRequest_wrapper;
RIL_RadioFunctions_wrap.supports = RIL_Supports_wrapper;
RIL_RadioFunctions_wrap.onCancel = RIL_Cancel_wrapper;
RIL_RadioFunctions_wrap.getVersion = RIL_GetVersion_wrapper;
LOGV("Initializing threads!");
RIL_startThreads(&RIL_RadioFunctions_wrap, &RIL_Env_wrap);
LOGV("RIL_Init wrapper returning!");
return &RIL_RadioFunctions_wrap;
}