blob: 0d36320ebd4e8625262ce4467def23d5e1e91af6 [file] [log] [blame]
lle1d5d7c2022-01-18 12:34:30 +00001/*=============================================================================
2# FileName: lynq_sim.cpp
3# Desc: about SIM API
4# Author: mobiletek
5# Version: V1.0
6# LastChange: 2021-12-29
7# History:
8=============================================================================*/
9#include <stdio.h>
10#include <sys/types.h>
11#include <sys/socket.h>
12#include <arpa/inet.h>
13#include <string.h>
14#include <unistd.h>
15#include <binder/Parcel.h>
16#include <log/log.h>
17#include <cutils/jstring.h>
18#include <pthread.h>
19#include "lynq_sim.h"
20#include <sys/socket.h>
21#include <netinet/in.h>
22#include <arpa/inet.h>
jb.qi6b23ed42022-09-22 00:30:55 -070023#include <errno.h> /*add for get recvfrom errorid on 20220921*/
lle1d5d7c2022-01-18 12:34:30 +000024#define MAX_BUF 20
25#define MAX_NUM 80
26#define RIL_REQUEST_GET_SIM_STATUS 1
27#define RIL_REQUEST_GET_IMSI 11
28#define RIL_REQUEST_QUERY_ICCID 2026
29#define RIL_REQUEST_SET_FACILITY_LOCK 43
30#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
31#define RIL_REQUEST_ENTER_SIM_PIN 2
32#define RIL_REQUEST_ENTER_SIM_PUK 3
33#define RIL_REQUEST_CHANGE_SIM_PIN 6
34#define RIL_REQUEST_OEM_HOOK_RAW 59
ll887a0172022-03-09 03:13:31 +000035#define RIL_REQUEST_SCREEN_STATE 61
llba425bd2022-03-17 02:23:00 +000036#define RIL_REQUEST_SIM_IO 28
ll4c5c6b72022-03-31 15:27:23 +080037#define RIL_REQUEST_DEVICE_IDENTITY 98
rjw5d2a50e2022-02-28 15:01:49 +080038#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
jb.qi96449342022-09-19 22:14:41 -070039#define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/
lle1d5d7c2022-01-18 12:34:30 +000040#define MAX_LEN 1024*8
41#define MAX_NUM 10
42#define LOG_TAG "LYNQ_SIM"
43#define FLAG_TESS 0
44using ::android::Parcel;
45#define DEST_PORT 8088
46#define DSET_IP_ADDRESS "127.0.0.1"
47
48typedef struct{
49 int uToken;
50 int request;
51 int paramLen;
52 char param[MAX_LEN];
53}lynq_client_t;
54
55lynq_client_t client_t;
56/* socket文件描述符 */
57int len_addr_serv;
58struct sockaddr_in addr_serv;
59static int sock_fd = 0;
60int Global_uToken = 0;
q.huang7de1d662022-09-13 14:19:24 +080061int solicited_token = -1;
lle1d5d7c2022-01-18 12:34:30 +000062int resp_type = -1;
63int request = -1;
64int slot_id = -1;
65int error1 = -1;
llab0f3e12022-07-20 11:59:51 +000066static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000067/**
68 * @brief mark call initialization state
69 * 0: deinit state
70 * 1: init state
71 */
72int g_lynq_sim_init_flag = 0;
73
74/**
75 * @brief lynq_req_sim_io need to send request
76 */
77char data_buf[32] = {0};
78char pin2_buf[32] = {0};
79char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000080
llb15599d2022-04-01 07:50:08 +000081/**/
82char options_buf[32] = {0};
83char time_buf[32] = {0};
84char message_buf[32] = {0};
85
lle1d5d7c2022-01-18 12:34:30 +000086int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000087 if(g_lynq_sim_init_flag == 1)
88 {
89 RLOGD("lynq_sim_init failed");
90 return -1;
91 }
92 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000093 if(utoken < 0){
94 return -1;
95 }
lle1d5d7c2022-01-18 12:34:30 +000096 Global_uToken = utoken;
97 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +080098 if (-1 == sock_fd)
99 {
100 return sock_fd;
101 }
102 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000103 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800104 timeOut.tv_usec = 0;
105 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
106 {
107 RLOGD("time out setting failed\n");
108 return -1;
109 }
lle1d5d7c2022-01-18 12:34:30 +0000110 /* 设置address */
111 memset(&addr_serv, 0, sizeof(addr_serv));
112 addr_serv.sin_family = AF_INET;
113 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
114 addr_serv.sin_port = htons(DEST_PORT);
115 len_addr_serv = sizeof(addr_serv);
116 /*test*/
117 return 0;
118}
119
120int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000121 if(g_lynq_sim_init_flag == 0)
122 {
123 RLOGD("lynq_sim_deinit failed");
124 return -1;
125 }
126 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000127 close(sock_fd);
128 return 0;
129}
130
131static char * lynqStrdupReadString(Parcel &p) {
132 size_t stringlen;
133 const char16_t *s16;
134
135 s16 = p.readString16Inplace(&stringlen);
136 return strndup16to8(s16, stringlen);
137}
138
llba425bd2022-03-17 02:23:00 +0000139/*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/
lle1d5d7c2022-01-18 12:34:30 +0000140int lynq_get_sim_status(int *card_status)
141{
ll27dbe752022-08-10 00:33:52 -0700142 if(g_lynq_sim_init_flag == 0)
143 {
144 return -1;
145 }
lle1d5d7c2022-01-18 12:34:30 +0000146 int ret = -1;
147 if(card_status == NULL)
148 return ret;
149 int send_num = 0;
150 int recv_num = 0;
151 int len = 0;
152 lynq_client_t client_t1;
153 memset(&client_t1, 0, sizeof(client_t1) );
154 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
155 client_t1.paramLen = 0;
156 client_t1.uToken = Global_uToken;
157 char res_data[MAX_LEN] = {0};
158 int len1 = sizeof(client_t1.param);
159 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000160 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000161 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
162 if(send_num < 0)
163 {
164 RLOGD("sendto error:");
165 return send_num;
166 }
167 //get data msg
168 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
169 if(recv_num < 0 || recv_num == 0)
170 {
171 RLOGD("recvfrom step2 fail:");
172 return recv_num;
173 }
llab0f3e12022-07-20 11:59:51 +0000174 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000175 Parcel p;;
176 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
177 p.setDataPosition(0);
178 if(p.dataAvail() > 0)
179 {
180 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800181 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000182 p.readInt32(&request);
183 p.readInt32(&slot_id);
184 p.readInt32(&error1);
185 p.readInt32(card_status);
186 }
187 return error1;
188}
llba425bd2022-03-17 02:23:00 +0000189
lle1d5d7c2022-01-18 12:34:30 +0000190int lynq_get_imsi(char buf[])
191{
ll27dbe752022-08-10 00:33:52 -0700192 if(g_lynq_sim_init_flag == 0)
193 {
194 return -1;
195 }
lle1d5d7c2022-01-18 12:34:30 +0000196 int ret = -1;
197 if(buf == NULL)
198 return ret;
199 int send_num = 0;
200 int recv_num = 0;
201 int len = 0;
202 lynq_client_t client_t1;
203 memset(&client_t1, 0, sizeof(client_t1) );
204 client_t1.request = RIL_REQUEST_GET_IMSI;
205 client_t1.paramLen = 0;
206 client_t1.uToken = Global_uToken;
207 char res_data[MAX_LEN] = {0};
208 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000209 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000210 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
211 if(send_num < 0)
212 {
213 RLOGD("sendto error:");
214 return send_num;
215 }
216 //get data msg
217 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000218 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000219 if(recv_num < 0 || recv_num == 0)
220 {
221 RLOGD("recvfrom step2 fail:");
222 return recv_num;
223 }
224 Parcel p;
225 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
226 p.setDataPosition(0);
227 if(p.dataAvail() > 0)
228 {
229 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800230 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000231 p.readInt32(&request);
232 p.readInt32(&slot_id);
233 p.readInt32(&error1);
234 if(!error1){
235 char * test = lynqStrdupReadString(p);
236 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800237 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000238 }
239 }
240 return error1;
241}
242
243
244/*add by lei*/
245
246int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700247 if(g_lynq_sim_init_flag == 0)
248 {
249 return -1;
250 }
lle1d5d7c2022-01-18 12:34:30 +0000251 int ret = -1;
252 if(buf == NULL)
253 return ret;
254 int send_num = 0;
255 int recv_num = 0;
256 int len = 0;
257 client_t.request = RIL_REQUEST_QUERY_ICCID;
258 client_t.paramLen = 0;
259 client_t.uToken = Global_uToken;
260 char res_data[MAX_LEN] = {0};
261 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000262 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000263 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
264 if(send_num < 0)
265 {
266 RLOGD("sendto error:");
267 return send_num;
268 }
269 //get data msg
270 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000271 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000272 if(recv_num < 0 || recv_num == 0)
273 {
274 RLOGD("recvfrom step2 fail:");
275 return recv_num;
276 }
277 Parcel p;
278 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
279 p.setDataPosition(0);
280 if(p.dataAvail() > 0)
281 {
282 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800283 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000284 p.readInt32(&request);
285 p.readInt32(&slot_id);
286 p.readInt32(&error1);
287 if(!error1){
288 char * test = lynqStrdupReadString(p);
289 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800290 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000291 }
292 }
293 return error1;
294}
295
296int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700297 if(g_lynq_sim_init_flag == 0)
298 {
299 return -1;
300 }
lle1d5d7c2022-01-18 12:34:30 +0000301 int ret = -1;
302 if(pin == NULL)
303 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800304 if(!strlen(pin))
305 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000306 int send_num = 0;
307 int recv_num = 0;
308 char res_data[MAX_LEN] = {0};
309 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
310 client_t.paramLen = 4;
311 client_t.uToken = Global_uToken;
312 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000313 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000314 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
315 if(send_num < 0)
316 {
317 RLOGD("sendto error:");
318 return send_num;
319 }
320
321 //get data msg
322 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000323 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000324 if(recv_num < 0 || recv_num == 0)
325 {
326 RLOGD("recvfrom step2 fail:");
327 return recv_num;
328 }
329 Parcel p;
330 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
331 p.setDataPosition(0);
332 if(p.dataAvail() > 0)
333 {
334 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800335 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000336 p.readInt32(&request);
337 p.readInt32(&slot_id);
338 p.readInt32(&error1);
339 }
340 return error1;
341}
342
lle6cc3932022-08-18 06:06:39 -0700343int lynq_sim_power(int mode)
344{
345 if(g_lynq_sim_init_flag == 0)
346 {
347 return -1;
348 }
349 int ret = -1;
350 int send_num = 0;
351 int recv_num = 0;
352 int len = 0;
353 char res_data[MAX_LEN] = {0};
354 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
355 client_t.paramLen = 1;
356 client_t.uToken = Global_uToken;
357 char buf[64] = {0};
358 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
359 sprintf(client_t.param, "%s\n", buf);
360 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
361 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
362 if(send_num < 0)
363 {
364 RLOGD("sendto error:");
365 return ret;
366 }
367 //get data msg
368 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
369 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
370 if(recv_num < 0 || recv_num == 0)
371 {
372 RLOGD("recvfrom step2 fail:");
373 return recv_num;
374 }
375 Parcel p;
376 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
377 p.setDataPosition(0);
378 int num = -1;
379 if(p.dataAvail() > 0)
380 {
381 char test[128] = {0};
382 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800383 p.readInt32(&solicited_token);
lle6cc3932022-08-18 06:06:39 -0700384 p.readInt32(&request);
385 p.readInt32(&slot_id);
386 p.readInt32(&error1);
387 p.readInt32(&num);
388 if(num == -1){
389 }else{
390 p.read(test, num);
391 return error1;
392 }
393 }
394 return error1;
395}
396
lle1d5d7c2022-01-18 12:34:30 +0000397int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700398 if(g_lynq_sim_init_flag == 0)
399 {
400 return -1;
401 }
lle1d5d7c2022-01-18 12:34:30 +0000402 int ret = -1;
403 if(pin == NULL)
404 return ret;
405 int send_num = 0;
406 int recv_num = 0;
407 char res_data[MAX_LEN] = {0};
408 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
409 client_t.paramLen = 4;
410 client_t.uToken = Global_uToken;
411 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000412 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000413 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
414 if(send_num < 0)
415 {
416 RLOGD("sendto error:");
417 return send_num;
418 }
419 //get data msg
420 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000421 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000422 if(recv_num < 0 || recv_num == 0)
423 {
424 RLOGD("recvfrom step2 fail:");
425 return recv_num;
426 }
427 Parcel p;
428 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
429 p.setDataPosition(0);
430 if(p.dataAvail() > 0)
431 {
432 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800433 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000434 p.readInt32(&request);
435 p.readInt32(&slot_id);
436 p.readInt32(&error1);
437 }
438 return error1;
439}
440
441int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700442 if(g_lynq_sim_init_flag == 0)
443 {
444 return -1;
445 }
lle1d5d7c2022-01-18 12:34:30 +0000446 int ret = -1;
447 if(pin == NULL)
448 return ret;
449 int send_num = 0;
450 int recv_num = 0;
451 int len = 0;
452 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
453 client_t.paramLen = 3;
454 client_t.uToken = Global_uToken;
455 char res_data[MAX_LEN] = {0};
456 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000457 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000458 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
459 if(send_num < 0)
460 {
461 RLOGD("sendto error:");
462 return send_num;
463 }
464 //get data msg
465 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000466 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000467 if(recv_num < 0 || recv_num == 0)
468 {
469 RLOGD("recvfrom step2 fail:");
470 return recv_num;
471 }
472 Parcel p;
473 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
474 p.setDataPosition(0);
475 int num = -1;
476 if(p.dataAvail() > 0)
477 {
478 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800479 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000480 p.readInt32(&request);
481 p.readInt32(&slot_id);
482 p.readInt32(&error1);
483 p.readInt32(&num);
484 if(num > 0){
485 int *test = (int *)calloc(1, sizeof(int)*num);
486 for(int i =0; i <num; i++){
487 p.readInt32(&test[i]);
488 buf[i] = test[i];
489 }
490 free(test);
491 }
492 }
493 return error1;
494}
495
496int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700497 if(g_lynq_sim_init_flag == 0)
498 {
499 return -1;
500 }
lle1d5d7c2022-01-18 12:34:30 +0000501 int ret = -1;
502 if(pin == NULL)
503 return ret;
504 int send_num = 0;
505 int recv_num = 0;
506 char res_data[MAX_LEN] = {0};
507 int len = 0;
508 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
509 client_t.paramLen = 1;
510 client_t.uToken = Global_uToken;
511 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000512 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000513 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
514 if(send_num < 0)
515 {
516 RLOGD("sendto error:");
517 return send_num;
518 }
519 //get data msg
520 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000521 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000522 if(recv_num < 0 || recv_num == 0)
523 {
524 RLOGD("recvfrom step2 fail:");
525 return recv_num;
526 }
527 Parcel p;
528 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
529 p.setDataPosition(0);
530 if(p.dataAvail() > 0)
531 {
532 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800533 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000534 p.readInt32(&request);
535 p.readInt32(&slot_id);
536 p.readInt32(&error1);
537 }
538 return error1;
539}
540
541int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700542 if(g_lynq_sim_init_flag == 0)
543 {
544 return -1;
545 }
lle1d5d7c2022-01-18 12:34:30 +0000546 int ret = -1;
547 if(old_pin == NULL || new_pin == NULL)
548 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800549 if(!strlen(new_pin))
550 return ret;
ll3fe03462022-03-01 09:18:53 +0000551 if(!strlen(old_pin))
552 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000553 int send_num = 0;
554 int recv_num = 0;
555 char res_data[MAX_LEN] = {0};
556 int len = 0;
557 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
558 client_t.paramLen = 2;
559 client_t.uToken = Global_uToken;
560 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000561 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000562 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
563 if(send_num < 0)
564 {
565 RLOGD("sendto error:");
566 return send_num;
567 }
568 //get data msg
569 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000570 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000571 if(recv_num < 0 || recv_num == 0)
572 {
573 RLOGD("recvfrom step2 fail:");
574 return recv_num;
575 }
576 Parcel p;
577 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
578 p.setDataPosition(0);
579 if(p.dataAvail() > 0)
580 {
581 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800582 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000583 p.readInt32(&request);
584 p.readInt32(&slot_id);
585 p.readInt32(&error1);
586 }
587 return error1;
588}
589
590int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700591 if(g_lynq_sim_init_flag == 0)
592 {
593 return -1;
594 }
lle1d5d7c2022-01-18 12:34:30 +0000595 int ret = -1;
596 if(puk == NULL || pin == NULL)
597 return ret;
598 int send_num = 0;
599 int recv_num = 0;
600 char res_data[MAX_LEN] = {0};
601 int len = 0;
602 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
603 client_t.paramLen = 2;
604 client_t.uToken = Global_uToken;
605 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000606 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000607 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
608 if(send_num < 0)
609 {
610 RLOGD("sendto error:");
611 return send_num;
612 }
613 //get data msg
614 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000615 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000616 if(recv_num < 0 || recv_num == 0)
617 {
618 RLOGD("recvfrom step2 fail:");
619 return recv_num;
620 }
621 Parcel p;
622 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
623 p.setDataPosition(0);
624 if(p.dataAvail() > 0)
625 {
626 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800627 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000628 p.readInt32(&request);
629 p.readInt32(&slot_id);
630 p.readInt32(&error1);
631 }
632 return error1;
633}
634
635static void delete_char(char str[],char target){
636 if(str == NULL){
637 return;
638 }
639 int i,j;
640 for(i=j=0;str[i]!='\0';i++){
641 if(str[i]!=target){
642 str[j++]=str[i];
643 }
644 }
645 str[j]='\0';
646}
647
648static int parse_param(char *cmd, char **argv, char buf[]){
649 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800650 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000651 }
652 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000653 return 3;
654 }
655 else{
656 int argc = 0;
657 char *token;
658 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800659 if(token == NULL)
660 {
661 return 9001;
662 }
llbe2bdbd2022-06-14 02:40:33 +0000663 if(strstr(token, "CNUM"))
664 {
lle1d5d7c2022-01-18 12:34:30 +0000665 char *string;
666 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000667 {
668 if(argc == 5)
669 {
670 if(NULL == argv[1])
671 {
672 return 9002;
673 }
674 int lengh = strlen(argv[1]);
675 memcpy(buf, argv[1], lengh);
676 delete_char(buf, '"');
677 RLOGD("too many phone number return\n");
678 return 0;
679 }
lle1d5d7c2022-01-18 12:34:30 +0000680 string = token;
681 argv[argc++] = string;
682 token = strtok(NULL, ",");
683 }
llbe2bdbd2022-06-14 02:40:33 +0000684 if(NULL == argv[1])
685 {
686 return 9001;
687 }
lle1d5d7c2022-01-18 12:34:30 +0000688 int lengh = strlen(argv[1]);
689 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000690 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800691 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000692 }
llbe2bdbd2022-06-14 02:40:33 +0000693 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000694 }
lle1d5d7c2022-01-18 12:34:30 +0000695}
696
697int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700698 if(g_lynq_sim_init_flag == 0)
699 {
700 return -1;
701 }
lle1d5d7c2022-01-18 12:34:30 +0000702 int ret = -1;
703 if(buf == NULL)
704 return ret;
705 int send_num = 0;
706 int recv_num = 0;
707 int len = 0;
708 char res_data[MAX_LEN] = {0};
709 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
710 client_t.paramLen = 1;
711 client_t.uToken = Global_uToken;
712 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000713 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000714 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
715 if(send_num < 0)
716 {
717 RLOGD("sendto error:");
718 return ret;
719 }
720 //get data msg
721 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000722 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000723 if(recv_num < 0 || recv_num == 0)
724 {
725 RLOGD("recvfrom step2 fail:");
726 return recv_num;
727 }
728 Parcel p;
729 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
730 p.setDataPosition(0);
731 int num = -1;
732 if(p.dataAvail() > 0)
733 {
llb1fc9212022-04-12 03:02:01 +0000734 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000735 char *argv[5] = {0};
736 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800737 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000738 p.readInt32(&request);
739 p.readInt32(&slot_id);
740 p.readInt32(&error1);
741 p.readInt32(&num);
742 if(num == -1){
743 }else{
744 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800745 num = parse_param(test, argv, buf);
746 return num;
lle1d5d7c2022-01-18 12:34:30 +0000747 }
748 }
749 return error1;
750}
rjw5d2a50e2022-02-28 15:01:49 +0800751
ll4c5c6b72022-03-31 15:27:23 +0800752/**
753 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
754 *
755 * @param buf Type:[IN]
756 */
757static void parse_imei(char buf[])
758{
759 if(NULL == buf)
760 {
761 return;
762 }
763 const char s[2] = ",";
764 char *token;
765 token = strtok(buf, s);
766 return;
767}
768
769int lynq_get_imei(char buf[])
ll27dbe752022-08-10 00:33:52 -0700770{
771 if(g_lynq_sim_init_flag == 0)
772 {
773 return -1;
774 }
llfcd43492022-03-10 09:01:50 +0000775 int ret = -1;
776 if(buf == NULL)
777 return ret;
778 int send_num = 0;
779 int recv_num = 0;
780 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800781 lynq_client_t client_t1;
782 memset(&client_t1, 0, sizeof(client_t1) );
783 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
784 client_t1.paramLen = 0;
785 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000786 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800787 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000788 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800789 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000790 if(send_num < 0)
791 {
792 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800793 return send_num;
llfcd43492022-03-10 09:01:50 +0000794 }
ll4c5c6b72022-03-31 15:27:23 +0800795 //get data msg
llfcd43492022-03-10 09:01:50 +0000796 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000797 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000798 if(recv_num < 0 || recv_num == 0)
799 {
800 RLOGD("recvfrom step2 fail:");
801 return recv_num;
802 }
803 Parcel p;
804 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
805 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800806 int num = 0;
llfcd43492022-03-10 09:01:50 +0000807 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800808 {
llfcd43492022-03-10 09:01:50 +0000809 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800810 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000811 p.readInt32(&request);
812 p.readInt32(&slot_id);
813 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800814 if(!error1){
815 p.readInt32(&num);
816 char * test = lynqStrdupReadString(p);
817 parse_imei(test);
818 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800819 free(test);
llfcd43492022-03-10 09:01:50 +0000820 }
821 }
822 return error1;
823}
824
rjw5d2a50e2022-02-28 15:01:49 +0800825static int judge(int slot){
826 switch(slot){
827 case 0:
828 return -1;
829 case 1:
830 return -1;
831 }
832 return 0;
833}
834
rjw5d2a50e2022-02-28 15:01:49 +0800835int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700836 if(g_lynq_sim_init_flag == 0)
837 {
838 return -1;
839 }
rjw5d2a50e2022-02-28 15:01:49 +0800840 int ret = -1;
841 if(!judge(slot))
842 return ret;
843 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800844 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
845 client_t.paramLen = 1;
846 client_t.uToken = Global_uToken;
847 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000848 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800849 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
850 if(send_num < 0)
851 {
852 RLOGD("sendto error:");
853 return send_num;
854 }
llab0f3e12022-07-20 11:59:51 +0000855 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800856 return 0;
857}
jb.qi96449342022-09-19 22:14:41 -0700858/**@breif change screen state
859*param num type: [IN] screen_state,0:close,1:open
860*param ret type: [OUT] result,0:success,other:fail
861*return int
862*/
ll887a0172022-03-09 03:13:31 +0000863int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700864 if(g_lynq_sim_init_flag == 0)
865 {
866 return -1;
867 }
jb.qi96449342022-09-19 22:14:41 -0700868
ll887a0172022-03-09 03:13:31 +0000869 int ret = -1;
870 if(!judge(num))
871 return ret;
872 int send_num = 0;
jb.qi96449342022-09-19 22:14:41 -0700873 int recv_num = 0;
874 int error[2];
875 char res_data[MAX_LEN] = {0};
876
877 //change the first screen
878 client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
ll887a0172022-03-09 03:13:31 +0000879 client_t.paramLen = 1;
880 client_t.uToken = Global_uToken;
881 sprintf(client_t.param, "%d\n", num);
jb.qi96449342022-09-19 22:14:41 -0700882
llab0f3e12022-07-20 11:59:51 +0000883 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000884 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
885 if(send_num < 0)
886 {
jb.qi96449342022-09-19 22:14:41 -0700887 RLOGD("sendto error:\n");
ll887a0172022-03-09 03:13:31 +0000888 return send_num;
889 }
jb.qi96449342022-09-19 22:14:41 -0700890 for(int i=0;i<2;i++)
891 {
892 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
893 if(recv_num < 0 || recv_num == 0)
894 {
895 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
896 RLOGD("screen recvform error\n");
jb.qi6b23ed42022-09-22 00:30:55 -0700897 return errno;
jb.qi96449342022-09-19 22:14:41 -0700898 }
899 if(i == 1)
900 {
901 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
902 RLOGD("recvfrom success\n");
903 }
904 Parcel p;
905 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
906 p.setDataPosition(0);
907 if(p.dataAvail() > 0)
908 {
909 p.readInt32(&resp_type);
910 p.readInt32(&solicited_token);
911 p.readInt32(&request);
912 p.readInt32(&slot_id);
913 p.readInt32(&error1);
914 error[i] = error1;//change screen state result
915 }
916 }
917
918 if((error[0] != 0) || (error[1] != 0))
919 {
920 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
921 if(error[0] != 0)
922 {
923 return error[0];
924 }
925 else
926 {
927 return error[1];
928 }
929 }
930 else
931 {
932 return 0;
933 }
934
ll887a0172022-03-09 03:13:31 +0000935}
llba425bd2022-03-17 02:23:00 +0000936
937/**
938 * @brief Check whether the input is valid for lynq_req_sim_io api
939 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
940 * type: [IN] list[1]:EF id(fileid)
941 * type: [IN] list[2]:offset(p1)
942 * type: [IN] list[3]:offset(p2)
943 * type: [IN] list[4]:response len,sometimes needn't care(p3)
944 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
945 type: [IN] Path is in hex asciii format eg "7f205f70"
946 type: [IN] Path must always be provided.
947 * @param data type: [IN] May be NULL
948 * @param pin2 type: [IN] May be NULL
949 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
950 * @param sw type: [OUT]
951 * @param simResponse type: [OUT] response
952 * @return int
953 */
954static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
955{
llba425bd2022-03-17 02:23:00 +0000956 if(list == NULL)
957 {
958 return -1;
959 }
960 if(path == NULL)
961 {
962 return -1;
963 }
964 if(sw == NULL){
965 return -1;
966 }
967 if(simResponse == NULL){
968 return -1;
969 }
970 if(data == NULL)
971 {
972 memcpy(data_buf, "null", 4);
973 }
974 else
975 {
976 bzero(data_buf,32);
977 memcpy(data_buf, data, strlen(data));
978 }
979 if(pin2 == NULL)
980 {
981 memcpy(pin2_buf, "null", 4);
982 }
983 else
984 {
985 bzero(pin2_buf,32);
986 memcpy(pin2_buf, data, strlen(data));
987 }
988 if(aidPtr == NULL)
989 {
990 memcpy(aidPtr_buf, "null", 4);
991 }
992 else
993 {
994 bzero(aidPtr_buf,32);
995 memcpy(aidPtr_buf, data, strlen(data));
996 }
997 return 0;
998}
999
1000int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
ll27dbe752022-08-10 00:33:52 -07001001{
1002 if(g_lynq_sim_init_flag == 0)
1003 {
1004 return -1;
1005 }
llba425bd2022-03-17 02:23:00 +00001006 int ret = -1;
1007 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
1008 {
1009 return ret;
1010 }
1011 int send_num = 0;
1012 int recv_num = 0;
1013 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +00001014 client_t.request = RIL_REQUEST_SIM_IO;
1015 client_t.paramLen = 9;
1016 client_t.uToken = Global_uToken;
1017 sprintf(client_t.param, "%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
llab0f3e12022-07-20 11:59:51 +00001018 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001019 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1020 if(send_num < 0)
1021 {
1022 RLOGD("sendto error:");
1023 return send_num;
1024 }
1025 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +00001026 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001027 if(recv_num < 0 || recv_num == 0)
1028 {
1029 RLOGD("recvfrom step2 fail:");
1030 return recv_num;
1031 }
1032 Parcel p;
1033 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
1034 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +00001035 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +00001036 {
llba425bd2022-03-17 02:23:00 +00001037 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +08001038 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +00001039 p.readInt32(&request);
1040 p.readInt32(&slot_id);
1041 p.readInt32(&error1);
1042 if(!error1)
1043 {
1044 p.readInt32(&sw[0]);
1045 p.readInt32(&sw[1]);
1046 char * test = lynqStrdupReadString(p);
1047 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +08001048 free(test);
llba425bd2022-03-17 02:23:00 +00001049 }
1050
1051 }
1052 return error1;
1053}
llb15599d2022-04-01 07:50:08 +00001054
1055/**
1056 * @brief handle shutdown buf
1057 * @param options type: [IN]My Param doc
1058 * @param time type: [IN]My Param doc
1059 * @param message type: [IN]My Param doc
1060 */
1061static void handle_shutdown_buf(char options[], char time[], char message[])
1062{
1063 if(NULL == options)
1064 {
1065 bzero(options_buf, 32);
1066 memcpy(options_buf," ", 1);
1067 }
1068 else
1069 {
1070 memcpy(options_buf,options, strlen(options));
1071 }
1072 if(NULL == time)
1073 {
1074 bzero(time_buf, 32);
1075 memcpy(time_buf," ", 1);
1076 }
1077 else
1078 {
1079 memcpy(time_buf, time, strlen(time));
1080 }
1081 if(NULL == message)
1082 {
1083 bzero(message_buf, 32);
1084 memcpy(message_buf," ", 1);
1085 }
1086 else
1087 {
1088 memcpy(message_buf, message, strlen(message));
1089 }
1090}
1091
1092int lynq_shutdown(char options[], char time[], char message[])
1093{
1094 char cmd[128] = {0};
1095 handle_shutdown_buf(options, time, message);
1096 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1097 system(cmd);
1098 return 0;
1099}
1100
1101int lynq_get_version(char buf[])
1102{
1103 FILE * fp;
1104 char buffer[128];
1105 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1106 fp = popen(buffer, "r");
1107 fgets(buffer, sizeof(buffer), fp);
1108 memcpy(buf, buffer, strlen(buffer));
1109 buf[strlen(buffer)] = '\0';
1110 pclose(fp);
1111 return 0;
1112}
lle1d5d7c2022-01-18 12:34:30 +00001113#if FLAG_TESS
1114int lynq_query_operator(char buf[]){
1115 int32_t token = -1;
1116 if(buf == NULL)
1117 return token;
1118 char msg_imsi[20] = {0};
1119 memset(msg_imsi,0,sizeof(msg_imsi));
1120 token = lynq_get_imsi(msg_imsi);
1121 if(strlen(msg_imsi) != 0){
1122 FindOperator *ope_command = NULL;
1123 ope_command = find_ope_command(msg_imsi, findOperator);
1124 if(ope_command){
1125 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1126 buf[strlen(ope_command->buf)] = '\0';
1127 }
1128 else{
1129 /*more*/
1130 char mccmnc[5] = {0};
1131 memcpy(buf, msg_imsi, 5);
1132 buf[5] = '\0';
1133 /*more*/
1134 }
1135 return token;
1136 }
1137 else{
1138 //msg->base.e = err;
1139 const char *test = "please insert sim card";
1140 memcpy(buf, test, strlen(test));
1141 return token;
1142 }
1143}
1144FindOperator findOperator[] = {
1145#include "operator.h"
1146};
1147
1148static FindOperator*find_ope_command (char *name,FindOperator *Class){
1149 if(name == NULL || Class == NULL){
1150 return ((FindOperator *)NULL);
1151 }
1152 register int i;
1153 for (i = 0; Class[i].MCCMCN; i++)
1154 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1155 return (&Class[i]);
1156 return ((FindOperator *)NULL);
1157}
1158
1159#endif