blob: a4f607181a5c99d001d4ae06dac46f271bd01ae9 [file] [log] [blame]
b.liub17525e2025-05-14 17:22:29 +08001#include <stdio.h>
2#include <unistd.h>
3#include <sys/socket.h>
4#include <sys/un.h>
5#include <sys/types.h>
6#include <pthread.h>
7#include <errno.h>
8
9#include "dispatch.h"
10#include "lynq.h"
11#include "cc.h"
12#include "sms.h"
13#include "network.h"
14#include "data.h"
15#include "qser-voice.h"
16#include "sim.h"
17
18#define SOCKET_BUF_SIZE 512
19typedef struct {
20 char *name; /* User printable name of the function. */
21 int (*func)(int argc, char *argv[], int sp_test); /* Function to call to do the job. */
22 char *doc; /* Documentation for this function. */
23 int request;
24} COMMAND;
25
26COMMAND commands[] = {
27#include "req_commands.h"
28};
29
30int g_rdit_socket_fd = 0;
31int g_rdit_client_connect = -1;
32static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
33static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
34
35int has_registe_cmd = 0;
36struct sockaddr_un g_remote_addr = {0};
37struct sockaddr_un g_local_addr = {0};
38int g_create_socket = 0;
39int g_start_main_loop = 0;
40
41
42COMMAND* find_command (char *name)
43{
44 register int i;
45
46 for (i = 0; commands[i].name; i++)
47 if (strcmp (name, commands[i].name) == 0)
48 return (&commands[i]);
49
50 return ((COMMAND *)NULL);
51}
52
53const char *requestToString(int request)
54{
55 switch(request)
56 {
57 case LYNQ_DIAL: return "LYNQ_DIAL";
58 case LYNQ_ANSWER: return "LYNQ_ANSWER";
59 case LYNQ_HUNGUP: return "LYNQ_HUNGUP";
60 case LYNQ_QSER_CALL_INIT :return "LYNQ_QSER_CALL_INIT";
61 case LYNQ_QSER_CALL_DEINIT : return "LYNQ_QSER_CALL_DEINIT";
62 case LYNQ_QSER_CALL_START : return "LYNQ_QSER_CALL_START";
63 case LYNQ_QSER_CALL_ANSWER : return "LYNQ_QSER_CALL_ANSWER";
64 case LYNQ_QSER_CALL_END : return "LYNQ_QSER_CALL_END";
65 case LYNQ_QSER_CALL_HANDLER : return "LYNQ_QSER_CALL_HANDLER";
66 case LYNQ_QSER_CALL_REMOVE : return "LYNQ_QSER_CALL_REMOVE ";
67 default: return "<unknown request>";
68 }
69}
70int parse_param(char *cmd, char *argv[], int max_args)
71{
72 char *pos, *pos2;
73 int argc = 0;
74 printf("recive tester cmd=%s\n",cmd);
75 pos = cmd;
76 while (1) {
77 // Trim the space characters.
78 while (*pos == ' ') {
79 pos++;
80 }
81
82 if (*pos == '\0') {
83 break;
84 }
85
86 // One token may start with '"' or other characters.
87 if (*pos == '"' && (pos2 = strrchr(pos+1, '"'))) {
88 argv[argc++] = pos + 1;
89 *pos2 = '\0';
90 pos = pos2 + 1;
91 if(*pos == '\n'){
92 *pos = '\0';
93 pos = pos + 1;
94 }
95
96 } else {
97 argv[argc++] = pos;
98 while (*pos != '\0' && *pos != ' '&& *pos != '\n') {
99 pos++;
100 }
101 *pos++ = '\0';
102
103 if(argc == 1) {
104 char* at_cmd = strstr(argv[0], "RIL_REQUEST_OEM_HOOK_RAW");
105 if(at_cmd != NULL) {
106 while (*pos == ' ') {
107 pos++;
108 }
109 argv[argc++] = pos;
110 while (*pos != '\0' && *pos != '\n') {
111 pos++;
112 }
113 *pos++ = '\0';
114 break;
115 }
116 }
117
118 }
119
120 // Check if the maximum of arguments is reached.
121 if (argc == max_args) {
122 break;
123 }
124 }
125
126 return argc;
127}
128dispatch_manager::dispatch_manager()
129{
130 printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
131 __init_msg();
132}
133dispatch_manager::~ dispatch_manager(){}
134
135int dispatch_manager::__init_msg()
136{
137 printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
138 __request = 0;
139 __argc = 0;
140 __argv = NULL;
141 __socket_name = NULL;
142 return 0;
143}
144int dispatch_manager::__set_request_msg(int req,int argc,char *argv)
145{
146 printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
147 printf("requet=%d,argc=%d,argv p=%x\n");
148 __request = req;
149 __argc = argc;
150 __argv = argv;
151 return 0;
152}
153int dispatch_manager::set_request_msg(int req,int argc,char *argv)
154{
155 printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
156 return __set_request_msg(req,argc,argv);
157}
158
159
160int actsvc_cmd_recv(int fd, char *buf, int len)
161{
162 int ret = 0;
163 ret = recv(fd, buf, len, 0);
164 printf("[%d][%s] recv before\n",__LINE__,__FUNCTION__);
165 if (ret < 0)
166 {
167 printf("acti_cmd_recv service select error, ret=%d, error=%s(%d),fd=%d\n", ret,strerror(errno), errno, fd);
168 return LYNQ_E_SOCKET_FAIL;
169 }
170 else if(ret == 0)
171 {
172 printf("acti_cmd_recv service recv error, ret=%d, error=%s(%d),fd=%d\n", ret,strerror(errno), errno, fd);
173 return LYNQ_E_SOCKET_ZERO;
174 }
175 else
176 {
177 printf("[%d][%s] buf is:%s\n",__LINE__,__FUNCTION__,buf);
178 return LYNQ_E_SOCKET_SUCC;
179 }
180}
181
182int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog,int cs)
183{
184 printf("[%d][%s]start create socket\n",__LINE__,__FUNCTION__);
185 printf("domain:%d,type:%d,protocol:%d,port:%d,IP:%s,socket_name:%s,backlog:%d\n",domain,type,protocol,port,IP,socket_name,backlog);
186 int socket_fd = -1;
187 char acBuf[1024] = {0};
188 struct sockaddr_un *local_addr = NULL;
189 local_addr = (struct sockaddr_un *)addr;
190 socket_fd = socket(domain, type,protocol);
191 if(0 > socket_fd)
192 {
193 printf("create socket fail:fd = %d\n",socket_fd);
194 return socket_fd;
195 }
196 switch (domain)
197 {
198 case AF_UNIX:
199 {
200 if (strlen(socket_name) > sizeof(local_addr->sun_path) - 1)
201 {
202 printf("Server socket path too long: %s\n", socket_name);
203 return (-strlen(socket_name));
204 }
205 if(cs == 0)//0:service 1:client
206 {
207 printf("remove %s\n", socket_name);
208 if (remove(socket_name) == -1 && errno != ENOENT)
209 {
210 printf("remove-%s fail and errno:%d\n", socket_name,errno);
211 }
212 }
213 if(type == SOCK_STREAM)
214 {
215 while(access(socket_name, R_OK)==0)
216 {
217 printf("%s still exist\n", socket_name);
218 usleep(10);
219 }
220 }
221 local_addr->sun_family = AF_UNIX;
222 sprintf(local_addr->sun_path, "%s", socket_name);
223 if(cs == 0)//0:service 1:client
224 {
225 if(bind(socket_fd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_un)) < 0)
226 {
227 printf("bind failed name=[%s] reason=[%s]\n", socket_name, strerror(errno));
228 //printf("[%d][%s]bind fail and errno: %d",LINE,FUNC,errno);
229 close(socket_fd);
230 return -1;
231 }
232 if(type == SOCK_STREAM)
233 {
234 if(listen(socket_fd,backlog) == -1)
235 {
236 printf("[%d]listen fd: %dfail\n",__LINE__);
237 close(socket_fd);
238 return -1;
239 }
240 }
241 }
242 else
243 {
244 printf("init this client\n");
245 }
246 break;
247 }
248 case AF_INET:
249 {
250 break;
251 }
252 default:
253 break;
254 }
255 return socket_fd;
256}
257
258int dispatch_manager::init_socket(char *socket_name)
259{
260 socklen_t client_len;
261 int ret;
262 char parser_buf[SOCKET_BUF_SIZE];
263 TryNewSocket:
264 g_rdit_socket_fd = create_socket(AF_UNIX, SOCK_DGRAM,0, 0, NULL,socket_name, (void *)&g_local_addr, 2, 0);
265 if(0 > g_rdit_socket_fd)
266 {
267 printf("init socket fail and fd:%d",g_rdit_socket_fd);
268 g_create_socket++;
269 if(g_create_socket == 10)
270 {
271 printf("create_socket max try count is %d\n", g_create_socket);
272 return LYNQ_E_SOCKET_CREATE_FAIL;
273 }
274 else
275 {
276 printf("create_socket try again %d\n", g_create_socket);
277 usleep(500*1000);
278 goto TryNewSocket;
279 }
280 }
281 set_socket_fd(g_rdit_socket_fd);
282 return LYNQ_E_SUCCESS;
283}
284
285void *socket_read_loop(void *param)
286{
287 socklen_t client_len;
288 int ret = -1;
289 int socket_fd = -1;
290 char parser_buf[SOCKET_BUF_SIZE];
291 char *argv[32] = {0};
292 int argc = 0;
293 int *temp = (int*)param;
294 printf("in socket_read_loop , param=%p, *param=%d\n", param, (int)*(int*)param);
295 printf("[%d][%s] TryNewLink!\n", __LINE__,__FUNCTION__);
296 socket_fd = (int)*(int*)param;
297 pthread_mutex_lock(&s_startupMutex);
298 g_start_main_loop = 1;
299 pthread_cond_broadcast(&s_startupCond);
300 pthread_mutex_unlock(&s_startupMutex);
301 client_len = sizeof(g_local_addr);
302 printf("[%d][%s] socket_fd = %d,*temp=%d,%p, *param=%d!\n",__LINE__,__FUNCTION__,socket_fd,*temp, temp, (int)*(int*)param);
303#if 0
304 int conn = accept(socket_fd,(struct sockaddr *) &g_local_addr, &client_len);
305 if (conn <= 0)
306 {
307 printf("[%d][%s] accept error!",__LINE__,__FUNCTION__);
308 close(conn);
309 return NULL;
310 }
311 printf("Accept a client , fd is %d", conn);
312 if(g_rdit_client_connect >= 0)
313 {
314 printf("g_rdit_client_connect need close!");
315 close(g_rdit_client_connect);
316 }
317 g_rdit_client_connect = conn;
318#endif
319 /* tranlate data */
320 while (true)
321 {
322 memset(parser_buf, 0, sizeof(parser_buf));
323 ret = actsvc_cmd_recv(socket_fd, parser_buf, SOCKET_BUF_SIZE);
324 if (ret == LYNQ_E_SOCKET_FAIL)
325 {
326 printf("[%d][%s] LYNQ_E_SOCKET_FAIL receive CMD error\n",__LINE__,__FUNCTION__);
327 continue;
328 }
329 argc = parse_param(parser_buf,argv,32);
330 if(argc < 1)
331 {
332 printf("%s: error input.\n", parser_buf);
333 continue;
334 }
335 for(int i = 0;i < argc;i++)
336 {
337 printf("argc:%d---argv = %s\n",i,argv[i]);
338 }
339 COMMAND *command = find_command(argv[0]);
340 if(!command)
341 {
342 printf("%s: No such command for MobileTek_Tester_RDIT\n", argv[0]);
343 continue;
344 }
345 (*(command->func))(argc,argv,0);
346 }
347 return NULL;
348}
349
350
351void dispatch_manager::start_main_loop()
352{
353 printf("[%d][%s] enter!\n",__LINE__,__FUNCTION__);
354 g_start_main_loop = 0;
355 pthread_t s_tid_dispatch;
356 pthread_mutex_lock(&s_startupMutex);
357 pthread_attr_t attr;
358 pthread_attr_init(&attr);
359 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
360 int socket_fd = get_socket_fd();
361 printf("[%d][%s] socket_fd = %d,%p!\n",__LINE__,__FUNCTION__,socket_fd,&socket_fd);
362 int result = pthread_create(&s_tid_dispatch, &attr,socket_read_loop, (void *)&socket_fd);
363 if (result != 0) {
364 printf("Failed to create dispatch thread: %s\n", strerror(result));
365 goto done;
366 }
367
368 while (g_start_main_loop == 0) {
369 pthread_cond_wait(&s_startupCond, &s_startupMutex);
370 }
371 //warren delete,beacuse of update at fwk.
372 /*mobiletek add*
373 s_started = 0;
374 result = pthread_create(&s_tid_dispatch, &attr, eventLoop_at, NULL);
375 if (result != 0) {
376 printf("Failed to create dispatch thread: %s", strerror(result));
377 goto done;
378 }
379
380 while (s_started == 0) {
381 pthread_cond_wait(&s_startupCond, &s_startupMutex);
382 }
383 *mobiletek add
384 result = pthread_create(&s_tid_dispatch, &attr, responseLoop, NULL);
385 if (result != 0) {
386 printf("Failed to create response dispatch thread: %s", strerror(result));
387 goto done;
388 }
389
390 while (s_responseDispatch == 0) {
391 pthread_cond_wait(&s_startupCond, &s_startupMutex);
392 }
393 */
394done:
395 pthread_mutex_unlock(&s_startupMutex);
396}