blob: 223011bb67655033c26231e12153266a6fc97191 [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>
23#define MAX_BUF 20
24#define MAX_NUM 80
25#define RIL_REQUEST_GET_SIM_STATUS 1
26#define RIL_REQUEST_GET_IMSI 11
27#define RIL_REQUEST_QUERY_ICCID 2026
28#define RIL_REQUEST_SET_FACILITY_LOCK 43
29#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
30#define RIL_REQUEST_ENTER_SIM_PIN 2
31#define RIL_REQUEST_ENTER_SIM_PUK 3
32#define RIL_REQUEST_CHANGE_SIM_PIN 6
33#define RIL_REQUEST_OEM_HOOK_RAW 59
ll887a0172022-03-09 03:13:31 +000034#define RIL_REQUEST_SCREEN_STATE 61
llba425bd2022-03-17 02:23:00 +000035#define RIL_REQUEST_SIM_IO 28
ll4c5c6b72022-03-31 15:27:23 +080036#define RIL_REQUEST_DEVICE_IDENTITY 98
rjw5d2a50e2022-02-28 15:01:49 +080037#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
jb.qi96449342022-09-19 22:14:41 -070038#define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/
lle1d5d7c2022-01-18 12:34:30 +000039#define MAX_LEN 1024*8
40#define MAX_NUM 10
41#define LOG_TAG "LYNQ_SIM"
42#define FLAG_TESS 0
43using ::android::Parcel;
44#define DEST_PORT 8088
45#define DSET_IP_ADDRESS "127.0.0.1"
46
47typedef struct{
48 int uToken;
49 int request;
50 int paramLen;
51 char param[MAX_LEN];
52}lynq_client_t;
53
54lynq_client_t client_t;
55/* socket文件描述符 */
56int len_addr_serv;
57struct sockaddr_in addr_serv;
58static int sock_fd = 0;
59int Global_uToken = 0;
q.huang7de1d662022-09-13 14:19:24 +080060int solicited_token = -1;
lle1d5d7c2022-01-18 12:34:30 +000061int resp_type = -1;
62int request = -1;
63int slot_id = -1;
64int error1 = -1;
llab0f3e12022-07-20 11:59:51 +000065static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000066/**
67 * @brief mark call initialization state
68 * 0: deinit state
69 * 1: init state
70 */
71int g_lynq_sim_init_flag = 0;
72
73/**
74 * @brief lynq_req_sim_io need to send request
75 */
76char data_buf[32] = {0};
77char pin2_buf[32] = {0};
78char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000079
llb15599d2022-04-01 07:50:08 +000080/**/
81char options_buf[32] = {0};
82char time_buf[32] = {0};
83char message_buf[32] = {0};
84
lle1d5d7c2022-01-18 12:34:30 +000085int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000086 if(g_lynq_sim_init_flag == 1)
87 {
88 RLOGD("lynq_sim_init failed");
89 return -1;
90 }
91 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000092 if(utoken < 0){
93 return -1;
94 }
lle1d5d7c2022-01-18 12:34:30 +000095 Global_uToken = utoken;
96 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +080097 if (-1 == sock_fd)
98 {
99 return sock_fd;
100 }
101 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000102 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800103 timeOut.tv_usec = 0;
104 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
105 {
106 RLOGD("time out setting failed\n");
107 return -1;
108 }
lle1d5d7c2022-01-18 12:34:30 +0000109 /* 设置address */
110 memset(&addr_serv, 0, sizeof(addr_serv));
111 addr_serv.sin_family = AF_INET;
112 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
113 addr_serv.sin_port = htons(DEST_PORT);
114 len_addr_serv = sizeof(addr_serv);
115 /*test*/
116 return 0;
117}
118
119int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000120 if(g_lynq_sim_init_flag == 0)
121 {
122 RLOGD("lynq_sim_deinit failed");
123 return -1;
124 }
125 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000126 close(sock_fd);
127 return 0;
128}
129
130static char * lynqStrdupReadString(Parcel &p) {
131 size_t stringlen;
132 const char16_t *s16;
133
134 s16 = p.readString16Inplace(&stringlen);
135 return strndup16to8(s16, stringlen);
136}
137
llba425bd2022-03-17 02:23:00 +0000138/*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 +0000139int lynq_get_sim_status(int *card_status)
140{
ll27dbe752022-08-10 00:33:52 -0700141 if(g_lynq_sim_init_flag == 0)
142 {
143 return -1;
144 }
lle1d5d7c2022-01-18 12:34:30 +0000145 int ret = -1;
146 if(card_status == NULL)
147 return ret;
148 int send_num = 0;
149 int recv_num = 0;
150 int len = 0;
151 lynq_client_t client_t1;
152 memset(&client_t1, 0, sizeof(client_t1) );
153 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
154 client_t1.paramLen = 0;
155 client_t1.uToken = Global_uToken;
156 char res_data[MAX_LEN] = {0};
157 int len1 = sizeof(client_t1.param);
158 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000159 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000160 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
161 if(send_num < 0)
162 {
163 RLOGD("sendto error:");
164 return send_num;
165 }
166 //get data msg
167 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
168 if(recv_num < 0 || recv_num == 0)
169 {
170 RLOGD("recvfrom step2 fail:");
171 return recv_num;
172 }
llab0f3e12022-07-20 11:59:51 +0000173 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000174 Parcel p;;
175 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
176 p.setDataPosition(0);
177 if(p.dataAvail() > 0)
178 {
179 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800180 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000181 p.readInt32(&request);
182 p.readInt32(&slot_id);
183 p.readInt32(&error1);
184 p.readInt32(card_status);
185 }
186 return error1;
187}
llba425bd2022-03-17 02:23:00 +0000188
lle1d5d7c2022-01-18 12:34:30 +0000189int lynq_get_imsi(char buf[])
190{
ll27dbe752022-08-10 00:33:52 -0700191 if(g_lynq_sim_init_flag == 0)
192 {
193 return -1;
194 }
lle1d5d7c2022-01-18 12:34:30 +0000195 int ret = -1;
196 if(buf == NULL)
197 return ret;
198 int send_num = 0;
199 int recv_num = 0;
200 int len = 0;
201 lynq_client_t client_t1;
202 memset(&client_t1, 0, sizeof(client_t1) );
203 client_t1.request = RIL_REQUEST_GET_IMSI;
204 client_t1.paramLen = 0;
205 client_t1.uToken = Global_uToken;
206 char res_data[MAX_LEN] = {0};
207 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000208 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000209 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
210 if(send_num < 0)
211 {
212 RLOGD("sendto error:");
213 return send_num;
214 }
215 //get data msg
216 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 +0000217 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000218 if(recv_num < 0 || recv_num == 0)
219 {
220 RLOGD("recvfrom step2 fail:");
221 return recv_num;
222 }
223 Parcel p;
224 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
225 p.setDataPosition(0);
226 if(p.dataAvail() > 0)
227 {
228 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800229 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000230 p.readInt32(&request);
231 p.readInt32(&slot_id);
232 p.readInt32(&error1);
233 if(!error1){
234 char * test = lynqStrdupReadString(p);
235 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800236 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000237 }
238 }
239 return error1;
240}
241
242
243/*add by lei*/
244
245int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700246 if(g_lynq_sim_init_flag == 0)
247 {
248 return -1;
249 }
lle1d5d7c2022-01-18 12:34:30 +0000250 int ret = -1;
251 if(buf == NULL)
252 return ret;
253 int send_num = 0;
254 int recv_num = 0;
255 int len = 0;
256 client_t.request = RIL_REQUEST_QUERY_ICCID;
257 client_t.paramLen = 0;
258 client_t.uToken = Global_uToken;
259 char res_data[MAX_LEN] = {0};
260 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000261 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000262 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
263 if(send_num < 0)
264 {
265 RLOGD("sendto error:");
266 return send_num;
267 }
268 //get data msg
269 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 +0000270 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000271 if(recv_num < 0 || recv_num == 0)
272 {
273 RLOGD("recvfrom step2 fail:");
274 return recv_num;
275 }
276 Parcel p;
277 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
278 p.setDataPosition(0);
279 if(p.dataAvail() > 0)
280 {
281 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800282 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000283 p.readInt32(&request);
284 p.readInt32(&slot_id);
285 p.readInt32(&error1);
286 if(!error1){
287 char * test = lynqStrdupReadString(p);
288 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800289 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000290 }
291 }
292 return error1;
293}
294
295int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700296 if(g_lynq_sim_init_flag == 0)
297 {
298 return -1;
299 }
lle1d5d7c2022-01-18 12:34:30 +0000300 int ret = -1;
301 if(pin == NULL)
302 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800303 if(!strlen(pin))
304 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000305 int send_num = 0;
306 int recv_num = 0;
307 char res_data[MAX_LEN] = {0};
308 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
309 client_t.paramLen = 4;
310 client_t.uToken = Global_uToken;
311 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000312 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000313 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
314 if(send_num < 0)
315 {
316 RLOGD("sendto error:");
317 return send_num;
318 }
319
320 //get data msg
321 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 +0000322 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000323 if(recv_num < 0 || recv_num == 0)
324 {
325 RLOGD("recvfrom step2 fail:");
326 return recv_num;
327 }
328 Parcel p;
329 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
330 p.setDataPosition(0);
331 if(p.dataAvail() > 0)
332 {
333 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800334 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000335 p.readInt32(&request);
336 p.readInt32(&slot_id);
337 p.readInt32(&error1);
338 }
339 return error1;
340}
341
lle6cc3932022-08-18 06:06:39 -0700342int lynq_sim_power(int mode)
343{
344 if(g_lynq_sim_init_flag == 0)
345 {
346 return -1;
347 }
348 int ret = -1;
349 int send_num = 0;
350 int recv_num = 0;
351 int len = 0;
352 char res_data[MAX_LEN] = {0};
353 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
354 client_t.paramLen = 1;
355 client_t.uToken = Global_uToken;
356 char buf[64] = {0};
357 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
358 sprintf(client_t.param, "%s\n", buf);
359 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
360 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
361 if(send_num < 0)
362 {
363 RLOGD("sendto error:");
364 return ret;
365 }
366 //get data msg
367 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
368 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
369 if(recv_num < 0 || recv_num == 0)
370 {
371 RLOGD("recvfrom step2 fail:");
372 return recv_num;
373 }
374 Parcel p;
375 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
376 p.setDataPosition(0);
377 int num = -1;
378 if(p.dataAvail() > 0)
379 {
380 char test[128] = {0};
381 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800382 p.readInt32(&solicited_token);
lle6cc3932022-08-18 06:06:39 -0700383 p.readInt32(&request);
384 p.readInt32(&slot_id);
385 p.readInt32(&error1);
386 p.readInt32(&num);
387 if(num == -1){
388 }else{
389 p.read(test, num);
390 return error1;
391 }
392 }
393 return error1;
394}
395
lle1d5d7c2022-01-18 12:34:30 +0000396int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700397 if(g_lynq_sim_init_flag == 0)
398 {
399 return -1;
400 }
lle1d5d7c2022-01-18 12:34:30 +0000401 int ret = -1;
402 if(pin == NULL)
403 return ret;
404 int send_num = 0;
405 int recv_num = 0;
406 char res_data[MAX_LEN] = {0};
407 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
408 client_t.paramLen = 4;
409 client_t.uToken = Global_uToken;
410 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000411 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000412 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
413 if(send_num < 0)
414 {
415 RLOGD("sendto error:");
416 return send_num;
417 }
418 //get data msg
419 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 +0000420 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000421 if(recv_num < 0 || recv_num == 0)
422 {
423 RLOGD("recvfrom step2 fail:");
424 return recv_num;
425 }
426 Parcel p;
427 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
428 p.setDataPosition(0);
429 if(p.dataAvail() > 0)
430 {
431 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800432 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000433 p.readInt32(&request);
434 p.readInt32(&slot_id);
435 p.readInt32(&error1);
436 }
437 return error1;
438}
439
440int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700441 if(g_lynq_sim_init_flag == 0)
442 {
443 return -1;
444 }
lle1d5d7c2022-01-18 12:34:30 +0000445 int ret = -1;
446 if(pin == NULL)
447 return ret;
448 int send_num = 0;
449 int recv_num = 0;
450 int len = 0;
451 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
452 client_t.paramLen = 3;
453 client_t.uToken = Global_uToken;
454 char res_data[MAX_LEN] = {0};
455 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000456 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000457 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
458 if(send_num < 0)
459 {
460 RLOGD("sendto error:");
461 return send_num;
462 }
463 //get data msg
464 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 +0000465 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000466 if(recv_num < 0 || recv_num == 0)
467 {
468 RLOGD("recvfrom step2 fail:");
469 return recv_num;
470 }
471 Parcel p;
472 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
473 p.setDataPosition(0);
474 int num = -1;
475 if(p.dataAvail() > 0)
476 {
477 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800478 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000479 p.readInt32(&request);
480 p.readInt32(&slot_id);
481 p.readInt32(&error1);
482 p.readInt32(&num);
483 if(num > 0){
484 int *test = (int *)calloc(1, sizeof(int)*num);
485 for(int i =0; i <num; i++){
486 p.readInt32(&test[i]);
487 buf[i] = test[i];
488 }
489 free(test);
490 }
491 }
492 return error1;
493}
494
495int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700496 if(g_lynq_sim_init_flag == 0)
497 {
498 return -1;
499 }
lle1d5d7c2022-01-18 12:34:30 +0000500 int ret = -1;
501 if(pin == NULL)
502 return ret;
503 int send_num = 0;
504 int recv_num = 0;
505 char res_data[MAX_LEN] = {0};
506 int len = 0;
507 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
508 client_t.paramLen = 1;
509 client_t.uToken = Global_uToken;
510 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000511 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000512 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
513 if(send_num < 0)
514 {
515 RLOGD("sendto error:");
516 return send_num;
517 }
518 //get data msg
519 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 +0000520 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000521 if(recv_num < 0 || recv_num == 0)
522 {
523 RLOGD("recvfrom step2 fail:");
524 return recv_num;
525 }
526 Parcel p;
527 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
528 p.setDataPosition(0);
529 if(p.dataAvail() > 0)
530 {
531 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800532 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000533 p.readInt32(&request);
534 p.readInt32(&slot_id);
535 p.readInt32(&error1);
536 }
537 return error1;
538}
539
540int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700541 if(g_lynq_sim_init_flag == 0)
542 {
543 return -1;
544 }
lle1d5d7c2022-01-18 12:34:30 +0000545 int ret = -1;
546 if(old_pin == NULL || new_pin == NULL)
547 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800548 if(!strlen(new_pin))
549 return ret;
ll3fe03462022-03-01 09:18:53 +0000550 if(!strlen(old_pin))
551 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000552 int send_num = 0;
553 int recv_num = 0;
554 char res_data[MAX_LEN] = {0};
555 int len = 0;
556 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
557 client_t.paramLen = 2;
558 client_t.uToken = Global_uToken;
559 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000560 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000561 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
562 if(send_num < 0)
563 {
564 RLOGD("sendto error:");
565 return send_num;
566 }
567 //get data msg
568 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 +0000569 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000570 if(recv_num < 0 || recv_num == 0)
571 {
572 RLOGD("recvfrom step2 fail:");
573 return recv_num;
574 }
575 Parcel p;
576 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
577 p.setDataPosition(0);
578 if(p.dataAvail() > 0)
579 {
580 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800581 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000582 p.readInt32(&request);
583 p.readInt32(&slot_id);
584 p.readInt32(&error1);
585 }
586 return error1;
587}
588
589int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700590 if(g_lynq_sim_init_flag == 0)
591 {
592 return -1;
593 }
lle1d5d7c2022-01-18 12:34:30 +0000594 int ret = -1;
595 if(puk == NULL || pin == NULL)
596 return ret;
597 int send_num = 0;
598 int recv_num = 0;
599 char res_data[MAX_LEN] = {0};
600 int len = 0;
601 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
602 client_t.paramLen = 2;
603 client_t.uToken = Global_uToken;
604 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000605 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000606 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
607 if(send_num < 0)
608 {
609 RLOGD("sendto error:");
610 return send_num;
611 }
612 //get data msg
613 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 +0000614 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000615 if(recv_num < 0 || recv_num == 0)
616 {
617 RLOGD("recvfrom step2 fail:");
618 return recv_num;
619 }
620 Parcel p;
621 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
622 p.setDataPosition(0);
623 if(p.dataAvail() > 0)
624 {
625 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800626 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000627 p.readInt32(&request);
628 p.readInt32(&slot_id);
629 p.readInt32(&error1);
630 }
631 return error1;
632}
633
634static void delete_char(char str[],char target){
635 if(str == NULL){
636 return;
637 }
638 int i,j;
639 for(i=j=0;str[i]!='\0';i++){
640 if(str[i]!=target){
641 str[j++]=str[i];
642 }
643 }
644 str[j]='\0';
645}
646
647static int parse_param(char *cmd, char **argv, char buf[]){
648 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800649 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000650 }
651 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000652 return 3;
653 }
654 else{
655 int argc = 0;
656 char *token;
657 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800658 if(token == NULL)
659 {
660 return 9001;
661 }
llbe2bdbd2022-06-14 02:40:33 +0000662 if(strstr(token, "CNUM"))
663 {
lle1d5d7c2022-01-18 12:34:30 +0000664 char *string;
665 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000666 {
667 if(argc == 5)
668 {
669 if(NULL == argv[1])
670 {
671 return 9002;
672 }
673 int lengh = strlen(argv[1]);
674 memcpy(buf, argv[1], lengh);
675 delete_char(buf, '"');
676 RLOGD("too many phone number return\n");
677 return 0;
678 }
lle1d5d7c2022-01-18 12:34:30 +0000679 string = token;
680 argv[argc++] = string;
681 token = strtok(NULL, ",");
682 }
llbe2bdbd2022-06-14 02:40:33 +0000683 if(NULL == argv[1])
684 {
685 return 9001;
686 }
lle1d5d7c2022-01-18 12:34:30 +0000687 int lengh = strlen(argv[1]);
688 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000689 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800690 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000691 }
llbe2bdbd2022-06-14 02:40:33 +0000692 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000693 }
lle1d5d7c2022-01-18 12:34:30 +0000694}
695
696int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700697 if(g_lynq_sim_init_flag == 0)
698 {
699 return -1;
700 }
lle1d5d7c2022-01-18 12:34:30 +0000701 int ret = -1;
702 if(buf == NULL)
703 return ret;
704 int send_num = 0;
705 int recv_num = 0;
706 int len = 0;
707 char res_data[MAX_LEN] = {0};
708 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
709 client_t.paramLen = 1;
710 client_t.uToken = Global_uToken;
711 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000712 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000713 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
714 if(send_num < 0)
715 {
716 RLOGD("sendto error:");
717 return ret;
718 }
719 //get data msg
720 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 +0000721 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000722 if(recv_num < 0 || recv_num == 0)
723 {
724 RLOGD("recvfrom step2 fail:");
725 return recv_num;
726 }
727 Parcel p;
728 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
729 p.setDataPosition(0);
730 int num = -1;
731 if(p.dataAvail() > 0)
732 {
llb1fc9212022-04-12 03:02:01 +0000733 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000734 char *argv[5] = {0};
735 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800736 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000737 p.readInt32(&request);
738 p.readInt32(&slot_id);
739 p.readInt32(&error1);
740 p.readInt32(&num);
741 if(num == -1){
742 }else{
743 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800744 num = parse_param(test, argv, buf);
745 return num;
lle1d5d7c2022-01-18 12:34:30 +0000746 }
747 }
748 return error1;
749}
rjw5d2a50e2022-02-28 15:01:49 +0800750
ll4c5c6b72022-03-31 15:27:23 +0800751/**
752 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
753 *
754 * @param buf Type:[IN]
755 */
756static void parse_imei(char buf[])
757{
758 if(NULL == buf)
759 {
760 return;
761 }
762 const char s[2] = ",";
763 char *token;
764 token = strtok(buf, s);
765 return;
766}
767
768int lynq_get_imei(char buf[])
ll27dbe752022-08-10 00:33:52 -0700769{
770 if(g_lynq_sim_init_flag == 0)
771 {
772 return -1;
773 }
llfcd43492022-03-10 09:01:50 +0000774 int ret = -1;
775 if(buf == NULL)
776 return ret;
777 int send_num = 0;
778 int recv_num = 0;
779 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800780 lynq_client_t client_t1;
781 memset(&client_t1, 0, sizeof(client_t1) );
782 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
783 client_t1.paramLen = 0;
784 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000785 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800786 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000787 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800788 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000789 if(send_num < 0)
790 {
791 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800792 return send_num;
llfcd43492022-03-10 09:01:50 +0000793 }
ll4c5c6b72022-03-31 15:27:23 +0800794 //get data msg
llfcd43492022-03-10 09:01:50 +0000795 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 +0000796 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000797 if(recv_num < 0 || recv_num == 0)
798 {
799 RLOGD("recvfrom step2 fail:");
800 return recv_num;
801 }
802 Parcel p;
803 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
804 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800805 int num = 0;
llfcd43492022-03-10 09:01:50 +0000806 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800807 {
llfcd43492022-03-10 09:01:50 +0000808 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800809 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000810 p.readInt32(&request);
811 p.readInt32(&slot_id);
812 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800813 if(!error1){
814 p.readInt32(&num);
815 char * test = lynqStrdupReadString(p);
816 parse_imei(test);
817 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800818 free(test);
llfcd43492022-03-10 09:01:50 +0000819 }
820 }
821 return error1;
822}
823
rjw5d2a50e2022-02-28 15:01:49 +0800824static int judge(int slot){
825 switch(slot){
826 case 0:
827 return -1;
828 case 1:
829 return -1;
830 }
831 return 0;
832}
833
rjw5d2a50e2022-02-28 15:01:49 +0800834int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700835 if(g_lynq_sim_init_flag == 0)
836 {
837 return -1;
838 }
rjw5d2a50e2022-02-28 15:01:49 +0800839 int ret = -1;
840 if(!judge(slot))
841 return ret;
842 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800843 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
844 client_t.paramLen = 1;
845 client_t.uToken = Global_uToken;
846 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000847 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800848 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
849 if(send_num < 0)
850 {
851 RLOGD("sendto error:");
852 return send_num;
853 }
llab0f3e12022-07-20 11:59:51 +0000854 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800855 return 0;
856}
jb.qi96449342022-09-19 22:14:41 -0700857/**@breif change screen state
858*param num type: [IN] screen_state,0:close,1:open
859*param ret type: [OUT] result,0:success,other:fail
860*return int
861*/
ll887a0172022-03-09 03:13:31 +0000862int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700863 if(g_lynq_sim_init_flag == 0)
864 {
865 return -1;
866 }
jb.qi96449342022-09-19 22:14:41 -0700867
ll887a0172022-03-09 03:13:31 +0000868 int ret = -1;
869 if(!judge(num))
870 return ret;
871 int send_num = 0;
jb.qi96449342022-09-19 22:14:41 -0700872 int recv_num = 0;
873 int error[2];
874 char res_data[MAX_LEN] = {0};
875
876 //change the first screen
877 client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
ll887a0172022-03-09 03:13:31 +0000878 client_t.paramLen = 1;
879 client_t.uToken = Global_uToken;
880 sprintf(client_t.param, "%d\n", num);
jb.qi96449342022-09-19 22:14:41 -0700881
llab0f3e12022-07-20 11:59:51 +0000882 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000883 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
884 if(send_num < 0)
885 {
jb.qi96449342022-09-19 22:14:41 -0700886 RLOGD("sendto error:\n");
ll887a0172022-03-09 03:13:31 +0000887 return send_num;
888 }
jb.qi96449342022-09-19 22:14:41 -0700889 for(int i=0;i<2;i++)
890 {
891 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
892 if(recv_num < 0 || recv_num == 0)
893 {
894 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
895 RLOGD("screen recvform error\n");
896 return recv_num;
897 }
898 else if(recv_num == 10060)
899 {
900 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); //recvfrom timeout
901 RLOGD("recvfrom timeout\n");
902 return recv_num;
903 }
904 if(i == 1)
905 {
906 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
907 RLOGD("recvfrom success\n");
908 }
909 Parcel p;
910 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
911 p.setDataPosition(0);
912 if(p.dataAvail() > 0)
913 {
914 p.readInt32(&resp_type);
915 p.readInt32(&solicited_token);
916 p.readInt32(&request);
917 p.readInt32(&slot_id);
918 p.readInt32(&error1);
919 error[i] = error1;//change screen state result
920 }
921 }
922
923 if((error[0] != 0) || (error[1] != 0))
924 {
925 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
926 if(error[0] != 0)
927 {
928 return error[0];
929 }
930 else
931 {
932 return error[1];
933 }
934 }
935 else
936 {
937 return 0;
938 }
939
ll887a0172022-03-09 03:13:31 +0000940}
llba425bd2022-03-17 02:23:00 +0000941
942/**
943 * @brief Check whether the input is valid for lynq_req_sim_io api
944 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
945 * type: [IN] list[1]:EF id(fileid)
946 * type: [IN] list[2]:offset(p1)
947 * type: [IN] list[3]:offset(p2)
948 * type: [IN] list[4]:response len,sometimes needn't care(p3)
949 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
950 type: [IN] Path is in hex asciii format eg "7f205f70"
951 type: [IN] Path must always be provided.
952 * @param data type: [IN] May be NULL
953 * @param pin2 type: [IN] May be NULL
954 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
955 * @param sw type: [OUT]
956 * @param simResponse type: [OUT] response
957 * @return int
958 */
959static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
960{
llba425bd2022-03-17 02:23:00 +0000961 if(list == NULL)
962 {
963 return -1;
964 }
965 if(path == NULL)
966 {
967 return -1;
968 }
969 if(sw == NULL){
970 return -1;
971 }
972 if(simResponse == NULL){
973 return -1;
974 }
975 if(data == NULL)
976 {
977 memcpy(data_buf, "null", 4);
978 }
979 else
980 {
981 bzero(data_buf,32);
982 memcpy(data_buf, data, strlen(data));
983 }
984 if(pin2 == NULL)
985 {
986 memcpy(pin2_buf, "null", 4);
987 }
988 else
989 {
990 bzero(pin2_buf,32);
991 memcpy(pin2_buf, data, strlen(data));
992 }
993 if(aidPtr == NULL)
994 {
995 memcpy(aidPtr_buf, "null", 4);
996 }
997 else
998 {
999 bzero(aidPtr_buf,32);
1000 memcpy(aidPtr_buf, data, strlen(data));
1001 }
1002 return 0;
1003}
1004
1005int 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 -07001006{
1007 if(g_lynq_sim_init_flag == 0)
1008 {
1009 return -1;
1010 }
llba425bd2022-03-17 02:23:00 +00001011 int ret = -1;
1012 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
1013 {
1014 return ret;
1015 }
1016 int send_num = 0;
1017 int recv_num = 0;
1018 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +00001019 client_t.request = RIL_REQUEST_SIM_IO;
1020 client_t.paramLen = 9;
1021 client_t.uToken = Global_uToken;
1022 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 +00001023 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001024 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1025 if(send_num < 0)
1026 {
1027 RLOGD("sendto error:");
1028 return send_num;
1029 }
1030 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 +00001031 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001032 if(recv_num < 0 || recv_num == 0)
1033 {
1034 RLOGD("recvfrom step2 fail:");
1035 return recv_num;
1036 }
1037 Parcel p;
1038 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
1039 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +00001040 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +00001041 {
llba425bd2022-03-17 02:23:00 +00001042 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +08001043 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +00001044 p.readInt32(&request);
1045 p.readInt32(&slot_id);
1046 p.readInt32(&error1);
1047 if(!error1)
1048 {
1049 p.readInt32(&sw[0]);
1050 p.readInt32(&sw[1]);
1051 char * test = lynqStrdupReadString(p);
1052 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +08001053 free(test);
llba425bd2022-03-17 02:23:00 +00001054 }
1055
1056 }
1057 return error1;
1058}
llb15599d2022-04-01 07:50:08 +00001059
1060/**
1061 * @brief handle shutdown buf
1062 * @param options type: [IN]My Param doc
1063 * @param time type: [IN]My Param doc
1064 * @param message type: [IN]My Param doc
1065 */
1066static void handle_shutdown_buf(char options[], char time[], char message[])
1067{
1068 if(NULL == options)
1069 {
1070 bzero(options_buf, 32);
1071 memcpy(options_buf," ", 1);
1072 }
1073 else
1074 {
1075 memcpy(options_buf,options, strlen(options));
1076 }
1077 if(NULL == time)
1078 {
1079 bzero(time_buf, 32);
1080 memcpy(time_buf," ", 1);
1081 }
1082 else
1083 {
1084 memcpy(time_buf, time, strlen(time));
1085 }
1086 if(NULL == message)
1087 {
1088 bzero(message_buf, 32);
1089 memcpy(message_buf," ", 1);
1090 }
1091 else
1092 {
1093 memcpy(message_buf, message, strlen(message));
1094 }
1095}
1096
1097int lynq_shutdown(char options[], char time[], char message[])
1098{
1099 char cmd[128] = {0};
1100 handle_shutdown_buf(options, time, message);
1101 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1102 system(cmd);
1103 return 0;
1104}
1105
1106int lynq_get_version(char buf[])
1107{
1108 FILE * fp;
1109 char buffer[128];
1110 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1111 fp = popen(buffer, "r");
1112 fgets(buffer, sizeof(buffer), fp);
1113 memcpy(buf, buffer, strlen(buffer));
1114 buf[strlen(buffer)] = '\0';
1115 pclose(fp);
1116 return 0;
1117}
lle1d5d7c2022-01-18 12:34:30 +00001118#if FLAG_TESS
1119int lynq_query_operator(char buf[]){
1120 int32_t token = -1;
1121 if(buf == NULL)
1122 return token;
1123 char msg_imsi[20] = {0};
1124 memset(msg_imsi,0,sizeof(msg_imsi));
1125 token = lynq_get_imsi(msg_imsi);
1126 if(strlen(msg_imsi) != 0){
1127 FindOperator *ope_command = NULL;
1128 ope_command = find_ope_command(msg_imsi, findOperator);
1129 if(ope_command){
1130 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1131 buf[strlen(ope_command->buf)] = '\0';
1132 }
1133 else{
1134 /*more*/
1135 char mccmnc[5] = {0};
1136 memcpy(buf, msg_imsi, 5);
1137 buf[5] = '\0';
1138 /*more*/
1139 }
1140 return token;
1141 }
1142 else{
1143 //msg->base.e = err;
1144 const char *test = "please insert sim card";
1145 memcpy(buf, test, strlen(test));
1146 return token;
1147 }
1148}
1149FindOperator findOperator[] = {
1150#include "operator.h"
1151};
1152
1153static FindOperator*find_ope_command (char *name,FindOperator *Class){
1154 if(name == NULL || Class == NULL){
1155 return ((FindOperator *)NULL);
1156 }
1157 register int i;
1158 for (i = 0; Class[i].MCCMCN; i++)
1159 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1160 return (&Class[i]);
1161 return ((FindOperator *)NULL);
1162}
1163
1164#endif