blob: 7ad019e909698db1631dbf7d784fce6244b64512 [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
lle1d5d7c2022-01-18 12:34:30 +000038#define MAX_LEN 1024*8
39#define MAX_NUM 10
40#define LOG_TAG "LYNQ_SIM"
41#define FLAG_TESS 0
42using ::android::Parcel;
43#define DEST_PORT 8088
44#define DSET_IP_ADDRESS "127.0.0.1"
45
46typedef struct{
47 int uToken;
48 int request;
49 int paramLen;
50 char param[MAX_LEN];
51}lynq_client_t;
52
53lynq_client_t client_t;
54/* socket文件描述符 */
55int len_addr_serv;
56struct sockaddr_in addr_serv;
57static int sock_fd = 0;
58int Global_uToken = 0;
q.huang7de1d662022-09-13 14:19:24 +080059int solicited_token = -1;
lle1d5d7c2022-01-18 12:34:30 +000060int resp_type = -1;
61int request = -1;
62int slot_id = -1;
63int error1 = -1;
llab0f3e12022-07-20 11:59:51 +000064static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000065/**
66 * @brief mark call initialization state
67 * 0: deinit state
68 * 1: init state
69 */
70int g_lynq_sim_init_flag = 0;
71
72/**
73 * @brief lynq_req_sim_io need to send request
74 */
75char data_buf[32] = {0};
76char pin2_buf[32] = {0};
77char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000078
llb15599d2022-04-01 07:50:08 +000079/**/
80char options_buf[32] = {0};
81char time_buf[32] = {0};
82char message_buf[32] = {0};
83
lle1d5d7c2022-01-18 12:34:30 +000084int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000085 if(g_lynq_sim_init_flag == 1)
86 {
87 RLOGD("lynq_sim_init failed");
88 return -1;
89 }
90 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000091 if(utoken < 0){
92 return -1;
93 }
lle1d5d7c2022-01-18 12:34:30 +000094 Global_uToken = utoken;
95 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +080096 if (-1 == sock_fd)
97 {
98 return sock_fd;
99 }
100 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000101 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800102 timeOut.tv_usec = 0;
103 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
104 {
105 RLOGD("time out setting failed\n");
106 return -1;
107 }
lle1d5d7c2022-01-18 12:34:30 +0000108 /* 设置address */
109 memset(&addr_serv, 0, sizeof(addr_serv));
110 addr_serv.sin_family = AF_INET;
111 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
112 addr_serv.sin_port = htons(DEST_PORT);
113 len_addr_serv = sizeof(addr_serv);
114 /*test*/
115 return 0;
116}
117
118int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000119 if(g_lynq_sim_init_flag == 0)
120 {
121 RLOGD("lynq_sim_deinit failed");
122 return -1;
123 }
124 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000125 close(sock_fd);
126 return 0;
127}
128
129static char * lynqStrdupReadString(Parcel &p) {
130 size_t stringlen;
131 const char16_t *s16;
132
133 s16 = p.readString16Inplace(&stringlen);
134 return strndup16to8(s16, stringlen);
135}
136
llba425bd2022-03-17 02:23:00 +0000137/*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 +0000138int lynq_get_sim_status(int *card_status)
139{
ll27dbe752022-08-10 00:33:52 -0700140 if(g_lynq_sim_init_flag == 0)
141 {
142 return -1;
143 }
lle1d5d7c2022-01-18 12:34:30 +0000144 int ret = -1;
145 if(card_status == NULL)
146 return ret;
147 int send_num = 0;
148 int recv_num = 0;
149 int len = 0;
150 lynq_client_t client_t1;
151 memset(&client_t1, 0, sizeof(client_t1) );
152 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
153 client_t1.paramLen = 0;
154 client_t1.uToken = Global_uToken;
155 char res_data[MAX_LEN] = {0};
156 int len1 = sizeof(client_t1.param);
157 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000158 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000159 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
160 if(send_num < 0)
161 {
162 RLOGD("sendto error:");
163 return send_num;
164 }
165 //get data msg
166 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
167 if(recv_num < 0 || recv_num == 0)
168 {
169 RLOGD("recvfrom step2 fail:");
170 return recv_num;
171 }
llab0f3e12022-07-20 11:59:51 +0000172 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000173 Parcel p;;
174 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
175 p.setDataPosition(0);
176 if(p.dataAvail() > 0)
177 {
178 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800179 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000180 p.readInt32(&request);
181 p.readInt32(&slot_id);
182 p.readInt32(&error1);
183 p.readInt32(card_status);
184 }
185 return error1;
186}
llba425bd2022-03-17 02:23:00 +0000187
lle1d5d7c2022-01-18 12:34:30 +0000188int lynq_get_imsi(char buf[])
189{
ll27dbe752022-08-10 00:33:52 -0700190 if(g_lynq_sim_init_flag == 0)
191 {
192 return -1;
193 }
lle1d5d7c2022-01-18 12:34:30 +0000194 int ret = -1;
195 if(buf == NULL)
196 return ret;
197 int send_num = 0;
198 int recv_num = 0;
199 int len = 0;
200 lynq_client_t client_t1;
201 memset(&client_t1, 0, sizeof(client_t1) );
202 client_t1.request = RIL_REQUEST_GET_IMSI;
203 client_t1.paramLen = 0;
204 client_t1.uToken = Global_uToken;
205 char res_data[MAX_LEN] = {0};
206 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000207 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000208 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
209 if(send_num < 0)
210 {
211 RLOGD("sendto error:");
212 return send_num;
213 }
214 //get data msg
215 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 +0000216 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000217 if(recv_num < 0 || recv_num == 0)
218 {
219 RLOGD("recvfrom step2 fail:");
220 return recv_num;
221 }
222 Parcel p;
223 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
224 p.setDataPosition(0);
225 if(p.dataAvail() > 0)
226 {
227 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800228 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000229 p.readInt32(&request);
230 p.readInt32(&slot_id);
231 p.readInt32(&error1);
232 if(!error1){
233 char * test = lynqStrdupReadString(p);
234 memcpy(buf, test, strlen(test));
235 }
236 }
237 return error1;
238}
239
240
241/*add by lei*/
242
243int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700244 if(g_lynq_sim_init_flag == 0)
245 {
246 return -1;
247 }
lle1d5d7c2022-01-18 12:34:30 +0000248 int ret = -1;
249 if(buf == NULL)
250 return ret;
251 int send_num = 0;
252 int recv_num = 0;
253 int len = 0;
254 client_t.request = RIL_REQUEST_QUERY_ICCID;
255 client_t.paramLen = 0;
256 client_t.uToken = Global_uToken;
257 char res_data[MAX_LEN] = {0};
258 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000259 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000260 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
261 if(send_num < 0)
262 {
263 RLOGD("sendto error:");
264 return send_num;
265 }
266 //get data msg
267 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 +0000268 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000269 if(recv_num < 0 || recv_num == 0)
270 {
271 RLOGD("recvfrom step2 fail:");
272 return recv_num;
273 }
274 Parcel p;
275 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
276 p.setDataPosition(0);
277 if(p.dataAvail() > 0)
278 {
279 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800280 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000281 p.readInt32(&request);
282 p.readInt32(&slot_id);
283 p.readInt32(&error1);
284 if(!error1){
285 char * test = lynqStrdupReadString(p);
286 memcpy(buf, test, strlen(test));
287 }
288 }
289 return error1;
290}
291
292int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700293 if(g_lynq_sim_init_flag == 0)
294 {
295 return -1;
296 }
lle1d5d7c2022-01-18 12:34:30 +0000297 int ret = -1;
298 if(pin == NULL)
299 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800300 if(!strlen(pin))
301 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000302 int send_num = 0;
303 int recv_num = 0;
304 char res_data[MAX_LEN] = {0};
305 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
306 client_t.paramLen = 4;
307 client_t.uToken = Global_uToken;
308 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000309 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000310 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
311 if(send_num < 0)
312 {
313 RLOGD("sendto error:");
314 return send_num;
315 }
316
317 //get data msg
318 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 +0000319 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000320 if(recv_num < 0 || recv_num == 0)
321 {
322 RLOGD("recvfrom step2 fail:");
323 return recv_num;
324 }
325 Parcel p;
326 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
327 p.setDataPosition(0);
328 if(p.dataAvail() > 0)
329 {
330 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800331 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000332 p.readInt32(&request);
333 p.readInt32(&slot_id);
334 p.readInt32(&error1);
335 }
336 return error1;
337}
338
lle6cc3932022-08-18 06:06:39 -0700339int lynq_sim_power(int mode)
340{
341 if(g_lynq_sim_init_flag == 0)
342 {
343 return -1;
344 }
345 int ret = -1;
346 int send_num = 0;
347 int recv_num = 0;
348 int len = 0;
349 char res_data[MAX_LEN] = {0};
350 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
351 client_t.paramLen = 1;
352 client_t.uToken = Global_uToken;
353 char buf[64] = {0};
354 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
355 sprintf(client_t.param, "%s\n", buf);
356 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
357 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
358 if(send_num < 0)
359 {
360 RLOGD("sendto error:");
361 return ret;
362 }
363 //get data msg
364 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
365 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
366 if(recv_num < 0 || recv_num == 0)
367 {
368 RLOGD("recvfrom step2 fail:");
369 return recv_num;
370 }
371 Parcel p;
372 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
373 p.setDataPosition(0);
374 int num = -1;
375 if(p.dataAvail() > 0)
376 {
377 char test[128] = {0};
378 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800379 p.readInt32(&solicited_token);
lle6cc3932022-08-18 06:06:39 -0700380 p.readInt32(&request);
381 p.readInt32(&slot_id);
382 p.readInt32(&error1);
383 p.readInt32(&num);
384 if(num == -1){
385 }else{
386 p.read(test, num);
387 return error1;
388 }
389 }
390 return error1;
391}
392
lle1d5d7c2022-01-18 12:34:30 +0000393int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700394 if(g_lynq_sim_init_flag == 0)
395 {
396 return -1;
397 }
lle1d5d7c2022-01-18 12:34:30 +0000398 int ret = -1;
399 if(pin == NULL)
400 return ret;
401 int send_num = 0;
402 int recv_num = 0;
403 char res_data[MAX_LEN] = {0};
404 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
405 client_t.paramLen = 4;
406 client_t.uToken = Global_uToken;
407 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000408 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000409 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
410 if(send_num < 0)
411 {
412 RLOGD("sendto error:");
413 return send_num;
414 }
415 //get data msg
416 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 +0000417 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000418 if(recv_num < 0 || recv_num == 0)
419 {
420 RLOGD("recvfrom step2 fail:");
421 return recv_num;
422 }
423 Parcel p;
424 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
425 p.setDataPosition(0);
426 if(p.dataAvail() > 0)
427 {
428 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800429 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000430 p.readInt32(&request);
431 p.readInt32(&slot_id);
432 p.readInt32(&error1);
433 }
434 return error1;
435}
436
437int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700438 if(g_lynq_sim_init_flag == 0)
439 {
440 return -1;
441 }
lle1d5d7c2022-01-18 12:34:30 +0000442 int ret = -1;
443 if(pin == NULL)
444 return ret;
445 int send_num = 0;
446 int recv_num = 0;
447 int len = 0;
448 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
449 client_t.paramLen = 3;
450 client_t.uToken = Global_uToken;
451 char res_data[MAX_LEN] = {0};
452 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000453 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000454 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
455 if(send_num < 0)
456 {
457 RLOGD("sendto error:");
458 return send_num;
459 }
460 //get data msg
461 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 +0000462 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000463 if(recv_num < 0 || recv_num == 0)
464 {
465 RLOGD("recvfrom step2 fail:");
466 return recv_num;
467 }
468 Parcel p;
469 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
470 p.setDataPosition(0);
471 int num = -1;
472 if(p.dataAvail() > 0)
473 {
474 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800475 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000476 p.readInt32(&request);
477 p.readInt32(&slot_id);
478 p.readInt32(&error1);
479 p.readInt32(&num);
480 if(num > 0){
481 int *test = (int *)calloc(1, sizeof(int)*num);
482 for(int i =0; i <num; i++){
483 p.readInt32(&test[i]);
484 buf[i] = test[i];
485 }
486 free(test);
487 }
488 }
489 return error1;
490}
491
492int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700493 if(g_lynq_sim_init_flag == 0)
494 {
495 return -1;
496 }
lle1d5d7c2022-01-18 12:34:30 +0000497 int ret = -1;
498 if(pin == NULL)
499 return ret;
500 int send_num = 0;
501 int recv_num = 0;
502 char res_data[MAX_LEN] = {0};
503 int len = 0;
504 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
505 client_t.paramLen = 1;
506 client_t.uToken = Global_uToken;
507 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000508 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000509 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
510 if(send_num < 0)
511 {
512 RLOGD("sendto error:");
513 return send_num;
514 }
515 //get data msg
516 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 +0000517 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000518 if(recv_num < 0 || recv_num == 0)
519 {
520 RLOGD("recvfrom step2 fail:");
521 return recv_num;
522 }
523 Parcel p;
524 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
525 p.setDataPosition(0);
526 if(p.dataAvail() > 0)
527 {
528 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800529 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000530 p.readInt32(&request);
531 p.readInt32(&slot_id);
532 p.readInt32(&error1);
533 }
534 return error1;
535}
536
537int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700538 if(g_lynq_sim_init_flag == 0)
539 {
540 return -1;
541 }
lle1d5d7c2022-01-18 12:34:30 +0000542 int ret = -1;
543 if(old_pin == NULL || new_pin == NULL)
544 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800545 if(!strlen(new_pin))
546 return ret;
ll3fe03462022-03-01 09:18:53 +0000547 if(!strlen(old_pin))
548 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000549 int send_num = 0;
550 int recv_num = 0;
551 char res_data[MAX_LEN] = {0};
552 int len = 0;
553 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
554 client_t.paramLen = 2;
555 client_t.uToken = Global_uToken;
556 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000557 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000558 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
559 if(send_num < 0)
560 {
561 RLOGD("sendto error:");
562 return send_num;
563 }
564 //get data msg
565 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 +0000566 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000567 if(recv_num < 0 || recv_num == 0)
568 {
569 RLOGD("recvfrom step2 fail:");
570 return recv_num;
571 }
572 Parcel p;
573 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
574 p.setDataPosition(0);
575 if(p.dataAvail() > 0)
576 {
577 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800578 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000579 p.readInt32(&request);
580 p.readInt32(&slot_id);
581 p.readInt32(&error1);
582 }
583 return error1;
584}
585
586int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700587 if(g_lynq_sim_init_flag == 0)
588 {
589 return -1;
590 }
lle1d5d7c2022-01-18 12:34:30 +0000591 int ret = -1;
592 if(puk == NULL || pin == NULL)
593 return ret;
594 int send_num = 0;
595 int recv_num = 0;
596 char res_data[MAX_LEN] = {0};
597 int len = 0;
598 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
599 client_t.paramLen = 2;
600 client_t.uToken = Global_uToken;
601 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000602 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000603 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
604 if(send_num < 0)
605 {
606 RLOGD("sendto error:");
607 return send_num;
608 }
609 //get data msg
610 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 +0000611 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000612 if(recv_num < 0 || recv_num == 0)
613 {
614 RLOGD("recvfrom step2 fail:");
615 return recv_num;
616 }
617 Parcel p;
618 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
619 p.setDataPosition(0);
620 if(p.dataAvail() > 0)
621 {
622 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800623 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000624 p.readInt32(&request);
625 p.readInt32(&slot_id);
626 p.readInt32(&error1);
627 }
628 return error1;
629}
630
631static void delete_char(char str[],char target){
632 if(str == NULL){
633 return;
634 }
635 int i,j;
636 for(i=j=0;str[i]!='\0';i++){
637 if(str[i]!=target){
638 str[j++]=str[i];
639 }
640 }
641 str[j]='\0';
642}
643
644static int parse_param(char *cmd, char **argv, char buf[]){
645 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800646 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000647 }
648 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000649 return 3;
650 }
651 else{
652 int argc = 0;
653 char *token;
654 token = strtok(cmd, ",");
llbe2bdbd2022-06-14 02:40:33 +0000655 if(strstr(token, "CNUM"))
656 {
lle1d5d7c2022-01-18 12:34:30 +0000657 char *string;
658 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000659 {
660 if(argc == 5)
661 {
662 if(NULL == argv[1])
663 {
664 return 9002;
665 }
666 int lengh = strlen(argv[1]);
667 memcpy(buf, argv[1], lengh);
668 delete_char(buf, '"');
669 RLOGD("too many phone number return\n");
670 return 0;
671 }
lle1d5d7c2022-01-18 12:34:30 +0000672 string = token;
673 argv[argc++] = string;
674 token = strtok(NULL, ",");
675 }
llbe2bdbd2022-06-14 02:40:33 +0000676 if(NULL == argv[1])
677 {
678 return 9001;
679 }
lle1d5d7c2022-01-18 12:34:30 +0000680 int lengh = strlen(argv[1]);
681 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000682 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800683 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000684 }
llbe2bdbd2022-06-14 02:40:33 +0000685 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000686 }
lle1d5d7c2022-01-18 12:34:30 +0000687}
688
689int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700690 if(g_lynq_sim_init_flag == 0)
691 {
692 return -1;
693 }
lle1d5d7c2022-01-18 12:34:30 +0000694 int ret = -1;
695 if(buf == NULL)
696 return ret;
697 int send_num = 0;
698 int recv_num = 0;
699 int len = 0;
700 char res_data[MAX_LEN] = {0};
701 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
702 client_t.paramLen = 1;
703 client_t.uToken = Global_uToken;
704 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000705 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000706 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
707 if(send_num < 0)
708 {
709 RLOGD("sendto error:");
710 return ret;
711 }
712 //get data msg
713 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 +0000714 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000715 if(recv_num < 0 || recv_num == 0)
716 {
717 RLOGD("recvfrom step2 fail:");
718 return recv_num;
719 }
720 Parcel p;
721 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
722 p.setDataPosition(0);
723 int num = -1;
724 if(p.dataAvail() > 0)
725 {
llb1fc9212022-04-12 03:02:01 +0000726 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000727 char *argv[5] = {0};
728 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800729 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000730 p.readInt32(&request);
731 p.readInt32(&slot_id);
732 p.readInt32(&error1);
733 p.readInt32(&num);
734 if(num == -1){
735 }else{
736 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800737 num = parse_param(test, argv, buf);
738 return num;
lle1d5d7c2022-01-18 12:34:30 +0000739 }
740 }
741 return error1;
742}
rjw5d2a50e2022-02-28 15:01:49 +0800743
ll4c5c6b72022-03-31 15:27:23 +0800744/**
745 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
746 *
747 * @param buf Type:[IN]
748 */
749static void parse_imei(char buf[])
750{
751 if(NULL == buf)
752 {
753 return;
754 }
755 const char s[2] = ",";
756 char *token;
757 token = strtok(buf, s);
758 return;
759}
760
761int lynq_get_imei(char buf[])
ll27dbe752022-08-10 00:33:52 -0700762{
763 if(g_lynq_sim_init_flag == 0)
764 {
765 return -1;
766 }
llfcd43492022-03-10 09:01:50 +0000767 int ret = -1;
768 if(buf == NULL)
769 return ret;
770 int send_num = 0;
771 int recv_num = 0;
772 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800773 lynq_client_t client_t1;
774 memset(&client_t1, 0, sizeof(client_t1) );
775 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
776 client_t1.paramLen = 0;
777 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000778 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800779 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000780 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800781 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000782 if(send_num < 0)
783 {
784 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800785 return send_num;
llfcd43492022-03-10 09:01:50 +0000786 }
ll4c5c6b72022-03-31 15:27:23 +0800787 //get data msg
llfcd43492022-03-10 09:01:50 +0000788 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 +0000789 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000790 if(recv_num < 0 || recv_num == 0)
791 {
792 RLOGD("recvfrom step2 fail:");
793 return recv_num;
794 }
795 Parcel p;
796 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
797 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800798 int num = 0;
llfcd43492022-03-10 09:01:50 +0000799 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800800 {
llfcd43492022-03-10 09:01:50 +0000801 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800802 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000803 p.readInt32(&request);
804 p.readInt32(&slot_id);
805 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800806 if(!error1){
807 p.readInt32(&num);
808 char * test = lynqStrdupReadString(p);
809 parse_imei(test);
810 memcpy(buf, test, strlen(test));
llfcd43492022-03-10 09:01:50 +0000811 }
812 }
813 return error1;
814}
815
rjw5d2a50e2022-02-28 15:01:49 +0800816static int judge(int slot){
817 switch(slot){
818 case 0:
819 return -1;
820 case 1:
821 return -1;
822 }
823 return 0;
824}
825
rjw5d2a50e2022-02-28 15:01:49 +0800826int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700827 if(g_lynq_sim_init_flag == 0)
828 {
829 return -1;
830 }
rjw5d2a50e2022-02-28 15:01:49 +0800831 int ret = -1;
832 if(!judge(slot))
833 return ret;
834 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800835 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
836 client_t.paramLen = 1;
837 client_t.uToken = Global_uToken;
838 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000839 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800840 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
841 if(send_num < 0)
842 {
843 RLOGD("sendto error:");
844 return send_num;
845 }
llab0f3e12022-07-20 11:59:51 +0000846 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800847 return 0;
848}
ll887a0172022-03-09 03:13:31 +0000849
850int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700851 if(g_lynq_sim_init_flag == 0)
852 {
853 return -1;
854 }
ll887a0172022-03-09 03:13:31 +0000855 int ret = -1;
856 if(!judge(num))
857 return ret;
858 int send_num = 0;
ll887a0172022-03-09 03:13:31 +0000859 client_t.request = RIL_REQUEST_SCREEN_STATE;
860 client_t.paramLen = 1;
861 client_t.uToken = Global_uToken;
862 sprintf(client_t.param, "%d\n", num);
llab0f3e12022-07-20 11:59:51 +0000863 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000864 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
865 if(send_num < 0)
866 {
867 RLOGD("sendto error:");
868 return send_num;
869 }
llab0f3e12022-07-20 11:59:51 +0000870 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000871 return 0;
872}
llba425bd2022-03-17 02:23:00 +0000873
874/**
875 * @brief Check whether the input is valid for lynq_req_sim_io api
876 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
877 * type: [IN] list[1]:EF id(fileid)
878 * type: [IN] list[2]:offset(p1)
879 * type: [IN] list[3]:offset(p2)
880 * type: [IN] list[4]:response len,sometimes needn't care(p3)
881 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
882 type: [IN] Path is in hex asciii format eg "7f205f70"
883 type: [IN] Path must always be provided.
884 * @param data type: [IN] May be NULL
885 * @param pin2 type: [IN] May be NULL
886 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
887 * @param sw type: [OUT]
888 * @param simResponse type: [OUT] response
889 * @return int
890 */
891static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
892{
llba425bd2022-03-17 02:23:00 +0000893 if(list == NULL)
894 {
895 return -1;
896 }
897 if(path == NULL)
898 {
899 return -1;
900 }
901 if(sw == NULL){
902 return -1;
903 }
904 if(simResponse == NULL){
905 return -1;
906 }
907 if(data == NULL)
908 {
909 memcpy(data_buf, "null", 4);
910 }
911 else
912 {
913 bzero(data_buf,32);
914 memcpy(data_buf, data, strlen(data));
915 }
916 if(pin2 == NULL)
917 {
918 memcpy(pin2_buf, "null", 4);
919 }
920 else
921 {
922 bzero(pin2_buf,32);
923 memcpy(pin2_buf, data, strlen(data));
924 }
925 if(aidPtr == NULL)
926 {
927 memcpy(aidPtr_buf, "null", 4);
928 }
929 else
930 {
931 bzero(aidPtr_buf,32);
932 memcpy(aidPtr_buf, data, strlen(data));
933 }
934 return 0;
935}
936
937int 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 -0700938{
939 if(g_lynq_sim_init_flag == 0)
940 {
941 return -1;
942 }
llba425bd2022-03-17 02:23:00 +0000943 int ret = -1;
944 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
945 {
946 return ret;
947 }
948 int send_num = 0;
949 int recv_num = 0;
950 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +0000951 client_t.request = RIL_REQUEST_SIM_IO;
952 client_t.paramLen = 9;
953 client_t.uToken = Global_uToken;
954 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 +0000955 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000956 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
957 if(send_num < 0)
958 {
959 RLOGD("sendto error:");
960 return send_num;
961 }
962 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 +0000963 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000964 if(recv_num < 0 || recv_num == 0)
965 {
966 RLOGD("recvfrom step2 fail:");
967 return recv_num;
968 }
969 Parcel p;
970 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
971 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +0000972 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +0000973 {
llba425bd2022-03-17 02:23:00 +0000974 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800975 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +0000976 p.readInt32(&request);
977 p.readInt32(&slot_id);
978 p.readInt32(&error1);
979 if(!error1)
980 {
981 p.readInt32(&sw[0]);
982 p.readInt32(&sw[1]);
983 char * test = lynqStrdupReadString(p);
984 memcpy(simResponse, test, strlen(test));
985 }
986
987 }
988 return error1;
989}
llb15599d2022-04-01 07:50:08 +0000990
991/**
992 * @brief handle shutdown buf
993 * @param options type: [IN]My Param doc
994 * @param time type: [IN]My Param doc
995 * @param message type: [IN]My Param doc
996 */
997static void handle_shutdown_buf(char options[], char time[], char message[])
998{
999 if(NULL == options)
1000 {
1001 bzero(options_buf, 32);
1002 memcpy(options_buf," ", 1);
1003 }
1004 else
1005 {
1006 memcpy(options_buf,options, strlen(options));
1007 }
1008 if(NULL == time)
1009 {
1010 bzero(time_buf, 32);
1011 memcpy(time_buf," ", 1);
1012 }
1013 else
1014 {
1015 memcpy(time_buf, time, strlen(time));
1016 }
1017 if(NULL == message)
1018 {
1019 bzero(message_buf, 32);
1020 memcpy(message_buf," ", 1);
1021 }
1022 else
1023 {
1024 memcpy(message_buf, message, strlen(message));
1025 }
1026}
1027
1028int lynq_shutdown(char options[], char time[], char message[])
1029{
1030 char cmd[128] = {0};
1031 handle_shutdown_buf(options, time, message);
1032 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1033 system(cmd);
1034 return 0;
1035}
1036
1037int lynq_get_version(char buf[])
1038{
1039 FILE * fp;
1040 char buffer[128];
1041 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1042 fp = popen(buffer, "r");
1043 fgets(buffer, sizeof(buffer), fp);
1044 memcpy(buf, buffer, strlen(buffer));
1045 buf[strlen(buffer)] = '\0';
1046 pclose(fp);
1047 return 0;
1048}
lle1d5d7c2022-01-18 12:34:30 +00001049#if FLAG_TESS
1050int lynq_query_operator(char buf[]){
1051 int32_t token = -1;
1052 if(buf == NULL)
1053 return token;
1054 char msg_imsi[20] = {0};
1055 memset(msg_imsi,0,sizeof(msg_imsi));
1056 token = lynq_get_imsi(msg_imsi);
1057 if(strlen(msg_imsi) != 0){
1058 FindOperator *ope_command = NULL;
1059 ope_command = find_ope_command(msg_imsi, findOperator);
1060 if(ope_command){
1061 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1062 buf[strlen(ope_command->buf)] = '\0';
1063 }
1064 else{
1065 /*more*/
1066 char mccmnc[5] = {0};
1067 memcpy(buf, msg_imsi, 5);
1068 buf[5] = '\0';
1069 /*more*/
1070 }
1071 return token;
1072 }
1073 else{
1074 //msg->base.e = err;
1075 const char *test = "please insert sim card";
1076 memcpy(buf, test, strlen(test));
1077 return token;
1078 }
1079}
1080FindOperator findOperator[] = {
1081#include "operator.h"
1082};
1083
1084static FindOperator*find_ope_command (char *name,FindOperator *Class){
1085 if(name == NULL || Class == NULL){
1086 return ((FindOperator *)NULL);
1087 }
1088 register int i;
1089 for (i = 0; Class[i].MCCMCN; i++)
1090 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1091 return (&Class[i]);
1092 return ((FindOperator *)NULL);
1093}
1094
1095#endif