blob: 461c68c211c001b6bab7bb521deb5261869c45d4 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include <stdlib.h>
2#include <unistd.h>
3#include <signal.h>
4#include <errno.h>
5#include <sys/epoll.h>
6#include <sys/socket.h>
7#include <netinet/in.h>
8#include <arpa/inet.h>
9#include <sys/un.h>
10#include <sys/time.h>
11#include <fcntl.h>
12#include <netdb.h>
13#include <polarssl/net.h>
14#include <polarssl/ssl.h>
15#include <polarssl/entropy.h>
16#include <polarssl/ctr_drbg.h>
17#include <polarssl/certs.h>
18#include <polarssl/x509.h>
19#include <polarssl/error.h>
20#include <polarssl/debug.h>
21#include <polarssl/config.h>
22
23#ifdef LOG_TAG
24#undef LOG_TAG
25#endif
26#define LOG_TAG "mbtk_sock"
27#include <mbtk_log.h>
28
29#include "mbtk_sock2.h"
30#include "mbtk_sock_internal.h"
31//#include "mbtk_openssl.h"
32
33#define SA struct sockaddr
34
35// Must define LOG_TAG in the first.
36//#include "mbtk_log.h"
37static int epoll_fd = -1;
38static int pipe_fds[2];
39static struct epoll_event epoll_events[20];
40static pthread_t sock_thread_id = -1;
41static bool sock_thread_running = FALSE;
42static mbtk_sock_s *mbtk_sock[MBTK_HANDLE_MAX_NUM] = {NULL};
43
44static int sock_find_first_free(const mbtk_sock_inter_info_s *inter_info)
45{
46 if(inter_info == NULL) {
47 LOGE("inter_info is NULL.");
48 return -1;
49 }
50
51 int index = 0;
52 //while((inter_info + index)->fd > 0) {
53 while(inter_info[index].fd > 0) {
54 index++;
55 }
56
57 if(index == MBTK_SOCK_MAX_NUM) {
58 LOGE("sock_infos too more.");
59 return -1;
60 }
61
62 return index;
63}
64
65static bool sock_info_check(int handle,mbtk_sock_inter_info_s *inter_info)
66{
67 if(inter_info == NULL || mbtk_sock[handle] == NULL) {
68 LOGE("internal_info is NULL.");
69 return FALSE;
70 }
71
72 int index = 0;
73 while(index < MBTK_SOCK_MAX_NUM) {
74 if(inter_info->fd ==
75 mbtk_sock[handle]->inter_infos[index].fd) {
76 return TRUE;
77 }
78 index++;
79 }
80
81 return FALSE;
82}
83
84static bool sock_is_close(int sockfd)
85{
86 char buff[32];
87 int recvBytes = recv(sockfd, buff, sizeof(buff), MSG_PEEK);
88
89 int err = errno;
90 //cout << "In close function, recv " << recvBytes << " bytes, err " << sockErr << endl;
91
92 if(recvBytes > 0) //Get data
93 return FALSE;
94
95 if((recvBytes == -1) && (err == EWOULDBLOCK)) //No receive data
96 return FALSE;
97
98 return TRUE;
99}
100
101static int sock_info_find_by_fd(int handle,int fd)
102{
103 int index = 0;
104 while(index < MBTK_SOCK_MAX_NUM) {
105 if(fd == mbtk_sock[handle]->inter_infos[index].fd) {
106 return index;
107 }
108 index++;
109 }
110
111 return -1;
112}
113
114static void* sock_thread_run(void *data)
115{
116 LOGD("socket thread is running...");
117 if(data != NULL)
118 LOGD("sock_thread_run has arg.");
119
120 int nready;
121 if (socketpair( AF_UNIX, SOCK_STREAM, 0, pipe_fds) < 0) {
122 LOGE("socketpair() error.");
123 return NULL;
124 } else {
125 struct epoll_event ev;
126 ev.data.fd = pipe_fds[1];
127 ev.events = EPOLLIN | EPOLLET;
128 epoll_ctl(epoll_fd,EPOLL_CTL_ADD,pipe_fds[1],&ev);
129 }
130
131 while(sock_thread_running) {
132 nready = epoll_wait(epoll_fd,epoll_events,20,-1);
133 int i;
134 for(i=0;i<nready;++i) {
135 LOGD("fd[%d] event = %x",epoll_events[i].data.fd,epoll_events[i].events);
136 if(pipe_fds[1] == epoll_events[i].data.fd) {
137 LOGD("Get exist sig.");
138 sock_thread_running = FALSE;
139 break;
140 }
141
142 int handle = 0;
143 while(handle < MBTK_HANDLE_MAX_NUM) {
144 if(mbtk_sock[handle] != NULL) {
145 int index = sock_info_find_by_fd(handle,epoll_events[i].data.fd);
146 if(index >= 0 && mbtk_sock[handle]->init_info.sock_cb != NULL) {
147 mbtk_sock_inter_info_s *inter_info = &(mbtk_sock[handle]->inter_infos[index]);
148
149 //if(sock_is_close(epoll_events[i].data.fd)) {
150 // LOGE("Socket %d is closed.",epoll_events[i].data.fd);
151 // break;
152 //}
153
154 mbtk_sock[handle]->init_info.sock_cb(handle,inter_info->fd,epoll_events[i].events);
155
156 if(epoll_events[i].events & EPOLLERR){ // error[ UDP server can't use.]
157 LOGD("%d EPOLLERR.",epoll_events[i].data.fd);
158 }
159
160 if ((epoll_events[i].events & EPOLLIN)
161 && (epoll_events[i].events & EPOLLOUT)) {
162 LOGD("%d can read and write.",epoll_events[i].data.fd);
163 int error = -1;
164 int len = sizeof(int);
165 if(getsockopt(epoll_events[i].data.fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0){
166 LOGE("getsockopt fail.[%d]",errno);
167 }else{
168 LOGD("error = %d",error);
169 }
170 }
171
172 if (epoll_events[i].events & EPOLLOUT) { // Can write.
173 LOGD("%d can write.",epoll_events[i].data.fd);
174 }
175
176 if (epoll_events[i].events & EPOLLIN) { // Can read.
177 LOGD("%d can read.",epoll_events[i].data.fd);
178 }
179 }
180 }
181
182 handle++;
183 }
184 }
185 }
186
187 LOGD("socket thread exit.");
188 return ((void*)0);
189}
190
191static int sock_thread_start()
192{
193 sock_thread_running = TRUE;
194 if (0 != pthread_create(&sock_thread_id, NULL, sock_thread_run, NULL))
195 {
196 LOGE("error when create pthread,%d\n", errno);
197 return -1;
198 }
199
200 return 0;
201}
202
203extern mbtk_sock_handle mbtk_sock_init(mbtk_init_info *info)
204{
205 mbtk_sock_handle handle = 0;
206 while(handle < MBTK_HANDLE_MAX_NUM) {
207 if(mbtk_sock[handle] == NULL)
208 break;
209
210 handle++;
211 }
212
213 if(handle == MBTK_HANDLE_MAX_NUM) {
214 LOGE("Socket handle is full.");
215 return -1;
216 }
217
218 mbtk_sock[handle] = (mbtk_sock_s*)malloc(sizeof(mbtk_sock_s));
219 memset(mbtk_sock[handle],0x0,sizeof(mbtk_sock_s));
220 if(info != NULL) {
221 mbtk_sock[handle]->init_info.net_type = info->net_type;
222 mbtk_sock[handle]->init_info.net_cb = info->net_cb;
223 mbtk_sock[handle]->init_info.sock_cb = info->sock_cb;
224 } else {
225 mbtk_sock[handle]->init_info.net_type = MBTK_NET_LINUX;
226 mbtk_sock[handle]->init_info.net_cb = NULL;
227 mbtk_sock[handle]->init_info.sock_cb = NULL;
228 }
229
230 if(!sock_thread_running) {
231 epoll_fd = epoll_create(256);
232 if(sock_thread_start()) {
233 LOGE("Start thread fail.");
234 return -1;
235 }
236 }
237
238 return handle;
239}
240
241static int mbtk_ssl_init(int fd ,bool ingnore_cert,mbtk_sock_inter_info_s* inter_info)
242{
243 LOGE("8\n");
244 int ret = 0, len, tail_len, i, written, frags;
245 unsigned char buf[SSL_MAX_CONTENT_LEN + 1];
246 const char *pers = "ssl_client";
247 opt.server_name = DFL_SERVER_NAME;
248 opt.server_addr = DFL_SERVER_ADDR;
249 opt.server_port = DFL_SERVER_PORT;
250 opt.debug_level = DFL_DEBUG_LEVEL;
251 opt.nbio = DFL_NBIO;
252 opt.request_page = DFL_REQUEST_PAGE;
253 opt.request_size = DFL_REQUEST_SIZE;
254 opt.ca_file = DFL_CA_FILE;
255 opt.ca_path = DFL_CA_PATH;
256 opt.crt_file = DFL_CRT_FILE;
257 opt.key_file = DFL_KEY_FILE;
258 opt.psk = DFL_PSK;
259 opt.psk_identity = DFL_PSK_IDENTITY;
260 opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;
261 opt.renegotiation = DFL_RENEGOTIATION;
262 opt.allow_legacy = DFL_ALLOW_LEGACY;
263 opt.renegotiate = DFL_RENEGOTIATE;
264 opt.exchanges = DFL_EXCHANGES;
265 opt.min_version = DFL_MIN_VERSION;
266 opt.max_version = DFL_MAX_VERSION;
267 opt.auth_mode = DFL_AUTH_MODE;
268 opt.mfl_code = DFL_MFL_CODE;
269 opt.trunc_hmac = DFL_TRUNC_HMAC;
270 opt.reconnect = DFL_RECONNECT;
271 opt.reco_delay = DFL_RECO_DELAY;
272 opt.tickets = DFL_TICKETS;
273 opt.alpn_string = DFL_ALPN_STRING;
274
275 entropy_context entropy;
276 ctr_drbg_context ctr_drbg;
277 ssl_context ssl;
278 ssl_session saved_session;
279 x509_crt cacert;
280 x509_crt clicert;
281 pk_context pkey;
282
283 memset( &ssl, 0, sizeof( ssl_context ) );
284 memset( &saved_session, 0, sizeof( ssl_session ) );
285 x509_crt_init( &cacert );
286 x509_crt_init( &clicert );
287 pk_init( &pkey );
288 LOGE("9\n");
289 /*
290 * 0. Initialize the RNG and the session data
291 */
292
293 entropy_init( &entropy );
294 if( ( ret = ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
295 (const unsigned char *) pers,
296 strlen( pers ) ) ) != 0 )
297 {
298 LOGE( " failed\n ! ctr_drbg_init returned -0x%x\n", -ret );
299 return -1;
300 }
301 if(!ingnore_cert)
302 {
303 LOGE("10\n");
304 /*
305 * 1.1. Load the trusted CA
306 */
307 //ret = x509_crt_parse(&cacert,ca1_cert,strlen(ca1_cert));
308 ret = x509_crt_parse_file( &cacert, opt.ca_path );
309 if( ret < 0 )
310 {
311 LOGE( " failed\n ! ca x509_crt_parse returned -0x%x\n\n", -ret );
312 return -1;
313 }
314
315 /*
316 * 1.2. Load own certificate and private key
317 *
318 * (can be skipped if client authentication is not required)
319 */
320
321 ret = x509_crt_parse_file( &clicert, opt.crt_file );
322 if( ret != 0 )
323 {
324 LOGE( " failed\n ! crt x509_crt_parse returned -0x%x\n\n", -ret );
325 return -1;
326 }
327
328 ret = pk_parse_keyfile( &pkey, opt.key_file, NULL);
329 if( ret != 0 )
330 {
331 LOGE( " failed\n ! key x509_crt_parse returned -0x%x\n\n", -ret );
332 return -1;
333 }
334 }
335 /*
336 * 2. Setup stuff
337 */
338 LOGE( " . Setting up the SSL/TLS structure..." );
339
340 if( ( ret = ssl_init( &ssl ) ) != 0 )
341 {
342 LOGE( " failed\n ! ssl_init returned -0x%x\n\n", -ret );
343 return -1;
344 }
345
346 ssl_set_endpoint( &ssl, SSL_IS_CLIENT );
347 if(ingnore_cert)
348 {
349 opt.auth_mode = SSL_VERIFY_OPTIONAL;
350 }
351 else
352 {
353 opt.auth_mode = SSL_VERIFY_REQUIRED;
354 }
355
356 ssl_set_authmode( &ssl, opt.auth_mode );
357
358 ssl_set_rng( &ssl, ctr_drbg_random, &ctr_drbg );
359
360 ssl_set_bio( &ssl, net_recv, &fd, net_send, &fd );
361
362 ssl_set_renegotiation( &ssl, opt.renegotiation );
363 ssl_legacy_renegotiation( &ssl, opt.allow_legacy );
364
365 ssl_set_ca_chain( &ssl, &cacert, NULL, NULL );
366 if(!ingnore_cert)
367 {
368 if( ( ret = ssl_set_own_cert( &ssl, &clicert, &pkey ) ) != 0 )
369 {
370 LOGE( " failed\n ! ssl_set_own_cert returned %d\n\n", ret );
371 return -1;
372 }
373 }
374 if( opt.min_version != -1 )
375 ssl_set_min_version( &ssl, SSL_MAJOR_VERSION_3, opt.min_version );
376 if( opt.max_version != -1 )
377 ssl_set_max_version( &ssl, SSL_MAJOR_VERSION_3, opt.max_version );
378 /*
379 * 3. Handshake
380 */
381 LOGE( " . Performing the SSL/TLS handshake..." );
382
383 while( ( ret = ssl_handshake( &ssl ) ) != 0 )
384 {
385 if( ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE )
386 {
387 LOGE( " failed\n ! ssl_handshake returned -0x%x\n", -ret );
388 if( ret == POLARSSL_ERR_X509_CERT_VERIFY_FAILED )
389 LOGE(
390 " Unable to verify the server's certificate. "
391 "Either it is invalid,\n"
392 " or you didn't set ca_file or ca_path "
393 "to an appropriate value.\n"
394 " Alternatively, you may want to use "
395 "auth_mode=optional for testing purposes.\n" );
396 LOGE( "\n" );
397 return -1;;
398 }
399 }
400
401 LOGE( " ok\n [ Protocol is %s ]\n [ Ciphersuite is %s ]\n",ssl_get_version( &ssl ), ssl_get_ciphersuite( &ssl ) );
402 printf( " ok\n [ Protocol is %s ]\n [ Ciphersuite is %s ]\n",ssl_get_version( &ssl ), ssl_get_ciphersuite( &ssl ) );
403
404 /*
405 * 4. Verify the server certificate
406 */
407 LOGE( " . Verifying peer X.509 certificate..." );
408
409 if( ( ret = ssl_get_verify_result( &ssl ) ) != 0 )
410 {
411 LOGE( " failed\n" );
412
413 if( ( ret & BADCERT_EXPIRED ) != 0 )
414 LOGE( " ! server certificate has expired\n" );
415
416 if( ( ret & BADCERT_REVOKED ) != 0 )
417 LOGE( " ! server certificate has been revoked\n" );
418
419 if( ( ret & BADCERT_CN_MISMATCH ) != 0 )
420 LOGE( " ! CN mismatch (expected CN=%s)\n", opt.server_name );
421
422 if( ( ret & BADCERT_NOT_TRUSTED ) != 0 )
423 LOGE( " ! self-signed or not signed by a trusted CA\n" );
424
425 }
426
427 if( ssl_get_peer_cert( &ssl ) != NULL )
428 {
429 LOGE( " . Peer certificate information ...\n" );
430 x509_crt_info( (char *) buf, sizeof( buf ) - 1, " ",
431 ssl_get_peer_cert( &ssl ) );
432 LOGE( "%s\n", buf );
433 }
434
435 inter_info->cacert = &cacert;
436 inter_info->clicert = &clicert;
437 inter_info->ctr_drbg = &ctr_drbg;
438 inter_info->entropy = &entropy;
439 inter_info->pkey = &pkey;
440 inter_info->saved_session = &saved_session;
441 inter_info->ssl = &ssl;
442
443 return 0;
444}
445
446int mbtk_ssl_close(mbtk_sock_inter_info_s *inter_info)
447{
448 if (inter_info == NULL)
449 {
450 return -1;
451 }
452
453 int ret = -1;
454 while( ( ret = ssl_close_notify( inter_info->ssl ) ) < 0 )
455 {
456 if( ret == POLARSSL_ERR_NET_CONN_RESET )
457 {
458 LOGE( " ok (already closed by peer)\n" );
459 ret = 0;
460 return -1;
461 }
462
463 if( ret != POLARSSL_ERR_NET_WANT_READ &&
464 ret != POLARSSL_ERR_NET_WANT_WRITE )
465 {
466 LOGE( " failed\n ! ssl_close_notify returned %d\n\n", ret );
467 return -1;
468 }
469 }
470
471 x509_crt_free( inter_info->clicert );
472 x509_crt_free( inter_info->cacert );
473 pk_free( inter_info->pkey );
474 ssl_session_free( inter_info->saved_session );
475 ssl_free( inter_info->ssl );
476 ctr_drbg_free( inter_info->ctr_drbg );
477 entropy_free( inter_info->entropy );
478 return 0;
479}
480
481extern mbtk_sock_session mbtk_sock_open(mbtk_sock_handle handle,mbtk_sock_info *info,
482 unsigned int timeout,
483 int *mbtk_errno)
484{
485 if(handle < 0 || handle >= MBTK_HANDLE_MAX_NUM
486 || mbtk_sock[handle] == NULL) {
487 LOGE("Socket not inited.");
488 return -1;
489 }
490
491 *mbtk_errno = MBTK_SOCK_ERROR;
492 if(info == NULL) {
493 LOGE("mbtk_sock_info not be NULL.");
494 return -1;
495 }
496
497 int index_free = sock_find_first_free(mbtk_sock[handle]->inter_infos);
498 if(index_free < 0) {
499 LOGE("sock_find_first_free() fail.");
500 return -1;
501 }
502
503 memcpy(&(mbtk_sock[handle]->infos[index_free]),info,sizeof(mbtk_sock_info));
504 if(info->type == MBTK_SOCK_UDP) { // UDP
505 if((mbtk_sock[handle]->inter_infos[index_free].fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
506 LOGE("socket() fail.[%d]",errno);
507 goto result_fail;
508 }
509 } else { // TCP
510 if((mbtk_sock[handle]->inter_infos[index_free].fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
511 LOGE("socket() fail.[%d]",errno);
512 goto result_fail;
513 }
514 }
515 // Set O_NONBLOCK
516 int flags = fcntl(mbtk_sock[handle]->inter_infos[index_free].fd, F_GETFL, 0);
517 if (flags < 0) {
518 LOGE("Get flags error:%s\n", strerror(errno));
519 goto result_fail_with_close;
520 }
521 flags |= O_NONBLOCK;
522 if (fcntl(mbtk_sock[handle]->inter_infos[index_free].fd, F_SETFL, flags) < 0) {
523 LOGE("Set flags error:%s\n", strerror(errno));
524 goto result_fail_with_close;
525 }
526
527 // Connect
528 LOGD("Start conn:%s:%d",info->address,info->port);
529 if(strlen(info->address) > 0 && info->port > 0) {
530 struct sockaddr_in servaddr;
531 bzero(&servaddr, sizeof(servaddr));
532 servaddr.sin_family = AF_INET;
533 servaddr.sin_port = htons(info->port);
534
535 struct hostent *he = gethostbyname(info->address);
536 if (he == NULL){
537 LOGE("gethostbyname() fail.[%d]",errno);
538 goto result_fail_with_close;
539 } else {
540 LOGD("Ip : %s",he->h_addr_list[0]);
541 }
542 memcpy(&servaddr.sin_addr, he->h_addr_list[0], sizeof(struct in_addr));
543
544 if(connect(mbtk_sock[handle]->inter_infos[index_free].fd, (SA *) &servaddr, sizeof(servaddr)) < 0){
545 if(EINPROGRESS != errno){
546 LOGE("connect() fail.[%d]",errno);
547 goto result_fail_with_close;
548 }
549 }
550
551 fd_set rset, wset;
552 FD_ZERO(&rset);
553 FD_ZERO(&wset);
554 FD_SET(mbtk_sock[handle]->inter_infos[index_free].fd, &rset);
555 FD_SET(mbtk_sock[handle]->inter_infos[index_free].fd, &wset);
556 struct timeval time_out;
557 time_out.tv_sec = timeout/1000;
558 time_out.tv_usec = timeout%1000*1000;
559 int nready = select(mbtk_sock[handle]->inter_infos[index_free].fd + 1,
560 &rset, &wset, NULL, &time_out);
561 LOGD("nready = %d",nready);
562 if(nready == 0){// Timeout
563 LOGE("Timeout.");
564 printf("Timeout.\n");
565 goto result_fail_with_close;
566 }else{
567 if (FD_ISSET(mbtk_sock[handle]->inter_infos[index_free].fd, &rset)
568 && FD_ISSET(mbtk_sock[handle]->inter_infos[index_free].fd, &wset)) {
569 int error = -1;
570 int len = sizeof(int);
571 LOGE("Can read and write.");
572 if(getsockopt(mbtk_sock[handle]->inter_infos[index_free].fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0){
573 LOGE("getsockopt fail.[%d]",errno);
574 goto result_fail_with_close;
575 }else{
576 LOGE("error = %d",error);
577 if(error != 0){ // Fail
578 goto result_fail_with_close;
579 }
580 }
581 }else if(FD_ISSET(mbtk_sock[handle]->inter_infos[index_free].fd, &wset)){
582 LOGI("Can write.");
583 printf("Can write.\n");
584 }else{
585 LOGE("Can read(Impossible).");
586 goto result_fail_with_close;
587 }
588 }
589 } else {
590 LOGE("Can not conn.");
591 goto result_fail_with_close;
592 }
593
594 if(mbtk_sock[handle]->init_info.sock_cb) {
595 struct epoll_event ev;
596 ev.data.fd = mbtk_sock[handle]->inter_infos[index_free].fd;
597 ev.events = EPOLLIN | EPOLLET;
598 epoll_ctl(epoll_fd,EPOLL_CTL_ADD,mbtk_sock[handle]->inter_infos[index_free].fd,&ev);
599 }
600#if 1
601 if(info->ftp_ssl_support)
602 {
603 if(info->is_support_ssl){
604 mbtk_sock[handle]->infos[index_free].is_support_ssl = 0;
605 unsigned char mbtk_ftp_ssl_read_buf_s[256];
606 int err_rw;
607 memset(mbtk_ftp_ssl_read_buf_s,0,sizeof(mbtk_ftp_ssl_read_buf_s));
608 mbtk_sock_read(handle,mbtk_sock[handle]->inter_infos[index_free].fd,
609 mbtk_ftp_ssl_read_buf_s,
610 sizeof(mbtk_ftp_ssl_read_buf_s),
611 60000,
612 &err_rw);
613 printf("\nmbtk_sock_read:\n%s\n",mbtk_ftp_ssl_read_buf_s);
614
615 char cmd_buff[50];
616 int len=0,code;
617 memset(cmd_buff,0,sizeof(cmd_buff));
618
619 len = snprintf(cmd_buff, 50, "AUTH TLS\r\n");
620 cmd_buff[len] = '\0';
621 //printf("\n cmd_buff = %s\n", cmd_buff);
622
623 mbtk_sock_write(handle,mbtk_sock[handle]->inter_infos[index_free].fd,
624 cmd_buff,
625 strlen(cmd_buff),
626 60000,
627 &err_rw);
628
629 memset(mbtk_ftp_ssl_read_buf_s,0,sizeof(mbtk_ftp_ssl_read_buf_s));
630 mbtk_sock_read(handle,mbtk_sock[handle]->inter_infos[index_free].fd,
631 mbtk_ftp_ssl_read_buf_s,
632 sizeof(mbtk_ftp_ssl_read_buf_s),
633 60000,
634 &err_rw);
635 printf("\nmbtk_sock_read:\n%s\n",mbtk_ftp_ssl_read_buf_s);
636
637 mbtk_sock[handle]->infos[index_free].is_support_ssl=1;
638 }else{
639 mbtk_sock[handle]->infos[index_free].is_support_ssl=1;
640 }
641 }
642#endif
643 if(info->is_support_ssl){
644 if(mbtk_ssl_init(mbtk_sock[handle]->inter_infos[index_free].fd,info->ingnore_cert,&mbtk_sock[handle]->inter_infos[index_free]) == -1){
645 LOGE("mbtk_openssl_init fail");
646 goto result_fail_with_close;
647 }
648
649 }
650
651 *mbtk_errno = MBTK_SOCK_SUCCESS;
652
653 mbtk_sock[handle]->sock_num++;
654 return mbtk_sock[handle]->inter_infos[index_free].fd;
655result_fail_with_close:
656 close(mbtk_sock[handle]->inter_infos[index_free].fd);
657 mbtk_sock[handle]->inter_infos[index_free].fd = -1;
658result_fail:
659 memset(&(mbtk_sock[handle]->inter_infos[index_free]),0x0,sizeof(mbtk_sock_inter_info_s));
660 memset(&(mbtk_sock[handle]->infos[index_free]),0x0,sizeof(mbtk_sock_info));
661 LOGE("mbtk_sock_open() end:fail");
662 return -1;
663}
664extern int mbtk_ssl_init_func(mbtk_sock_handle handle ,bool ingnore_cert,mbtk_sock_session fd)
665{
666 int i=0;
667 int index_free=0;
668
669 for (i=0;i<10;i++)
670 {
671 if(mbtk_sock[handle]->inter_infos[i].fd == fd)
672 {
673 index_free = i;
674 break;
675 }
676 }
677 return mbtk_ssl_init(mbtk_sock[handle]->inter_infos[index_free].fd,ingnore_cert,&mbtk_sock[handle]->inter_infos[index_free]);
678}
679extern int mbtk_ssl_close_func(mbtk_sock_handle handle ,bool ingnore_cert,mbtk_sock_session fd)
680{
681 int i=0;
682 int index_free=0;
683
684 for (i=0;i<10;i++)
685 {
686 if(mbtk_sock[handle]->inter_infos[i].fd == fd)
687 {
688 index_free = i;
689 break;
690 }
691 }
692 if(mbtk_sock[handle]->inter_infos[index_free].ssl!=NULL);
693 printf("\nmbtk_sock[handle]->inter_infos[index_free].ssl not empty\n");
694 return mbtk_ssl_close(&mbtk_sock[handle]->inter_infos[index_free]);
695}
696
697extern int mbtk_sock_write(mbtk_sock_handle handle,mbtk_sock_session session,
698 void *buffer,
699 unsigned int buf_len,
700 unsigned int timeout,
701 int *mbtk_errno)
702{
703 if(handle < 0 || handle >= MBTK_HANDLE_MAX_NUM
704 || session < 0 || mbtk_sock[handle] == NULL) {
705 LOGE("Socket not inited.");
706 return -1;
707 }
708
709 *mbtk_errno = MBTK_SOCK_ERROR;
710 if(buffer == NULL) {
711 LOGE("mbtk_sock_write() args error.");
712 return -1;
713 }
714
715 mbtk_sock_inter_info_s *inter_info = NULL;
716 int index = 0;
717 while(index < MBTK_SOCK_MAX_NUM) {
718 if(session ==
719 mbtk_sock[handle]->inter_infos[index].fd) {
720 inter_info = &(mbtk_sock[handle]->inter_infos[index]);
721 break;
722 }
723 index++;
724 }
725
726 if(!sock_info_check(handle,inter_info)) {
727 LOGE("sock_info_check() fail.");
728 return -1;
729 }
730
731 index = sock_info_find_by_fd(handle,inter_info->fd);
732 if(index < 0) {
733 LOGE("No such socket in session list.");
734 return -1;
735 }
736
737 int len = 0;
738 unsigned int count = 0;
739 if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_TCP) {
740 while(count < buf_len){
741 if(mbtk_sock[handle]->infos[index].is_support_ssl)
742 len = ssl_write(inter_info->ssl,(char*)buffer + count,buf_len - count);
743 else
744 len = write(inter_info->fd,(char*)buffer + count,buf_len - count);
745 if(len < 0){
746 if(errno == EWOULDBLOCK){
747 usleep(50000);
748 continue;
749 } else {
750 LOGE("write error.[%d]",errno);
751 if(count <= 0)
752 count = -1;
753 break;
754 }
755 } else if(len == 0) {
756 LOGE("write error(len == 0).[%d]",errno);
757 } else {
758 count += len;
759 }
760 }
761 } else if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_UDP){
762 // Start send data
763 while(count < buf_len){
764 len = sendto(inter_info->fd,(char*)buffer + count,buf_len - count,0,NULL,0);
765 if(len < 0){
766 if(errno == EWOULDBLOCK){
767 usleep(50000);
768 continue;
769 } else {
770 LOGE("sendto error.[%d]",errno);
771 if(ECONNREFUSED == errno) { // Disconnected.
772 LOGD("Socket Disconnected.");
773 }
774 break;
775 }
776 } else if(len == 0) {
777 LOGD("write error(len == 0).[%d]",errno);
778 } else {
779 count += len;
780 }
781 }
782 } else {
783 LOGE("Socket type error.");
784 return -1;
785 }
786
787 if(count == buf_len){
788 LOGD("Write data[%d/%d] success.",count,buf_len);
789 } else { // Open session fail
790 LOGD("Write data[%d/%d] fail.",count,buf_len);
791 }
792
793 *mbtk_errno = MBTK_SOCK_SUCCESS;
794 return count;
795}
796
797extern int mbtk_sock_read(mbtk_sock_handle handle,mbtk_sock_session session,
798 void *buffer,
799 unsigned int buf_len,
800 unsigned int timeout,
801 int *mbtk_errno)
802{
803 if(handle < 0 || handle >= MBTK_HANDLE_MAX_NUM
804 || session < 0 || mbtk_sock[handle] == NULL) {
805 LOGE("Socket not inited.");
806 return -1;
807 }
808
809 *mbtk_errno = MBTK_SOCK_ERROR;
810 if(buffer == NULL) {
811 LOGE("mbtk_sock_write() args error.");
812 return -1;
813 }
814
815 mbtk_sock_inter_info_s *inter_info = NULL;
816 int index = 0;
817 while(index < MBTK_SOCK_MAX_NUM) {
818 if(session ==
819 mbtk_sock[handle]->inter_infos[index].fd) {
820 inter_info = &(mbtk_sock[handle]->inter_infos[index]);
821 break;
822 }
823 index++;
824 }
825
826 if(!sock_info_check(handle,inter_info)) {
827 LOGE("sock_info_check() fail.");
828 return -1;
829 }
830
831 index = sock_info_find_by_fd(handle,inter_info->fd);
832 if(index < 0) {
833 LOGE("No such socket in session list.");
834 return -1;
835 }
836
837 unsigned int count = 0;
838 if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_TCP) {
839 int len = 0;
840 int try_count = 0;
841 int times = timeout / 50;
842 memset(buffer,0x0,buf_len);
843 while(count < buf_len){
844 try_count++;
845 if(mbtk_sock[handle]->infos[index].is_support_ssl)
846 len = ssl_read(inter_info->ssl,(char*)buffer + count,buf_len - count);
847 else
848 len = read(inter_info->fd,(char*)buffer + count,buf_len - count);
849 if(len < 0){
850 if(errno == EWOULDBLOCK){
851 if(count > 0) // Read data
852 break; // Read data end.
853
854 if(try_count >= times){ // Timeout
855 count = -1;
856 if(times != 0) {
857 *mbtk_errno = MBTK_SOCK_ETIMEOUT;
858 }
859 LOGE("Not read enough data,return.[%d/%d]",count,buf_len);
860 break;
861 } else {
862 usleep(50000);
863 continue;
864 }
865 } else {
866 LOGE("read error.[%d]",errno);
867 if(count <= 0)
868 count = -1;
869 break;
870 }
871 } else if(len == 0) {
872 LOGE("read error(len == 0).[%d]",errno);
873 if(errno == EINPROGRESS) {
874 if(close(inter_info->fd) == 0) {// Success
875 LOGD("Socket disconnected.Close it.");
876 }
877 if(count <= 0)
878 count = -1;
879 } else {
880 if(count <= 0)
881 count = 0;
882 }
883 break;
884 } else {
885 count += len;
886 }
887 }
888 } else if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_UDP) {
889 // Start recv data
890 struct sockaddr_in seraddr;
891 socklen_t seraddr_len;
892 int try_count = 0;
893 int times = timeout / 50;
894 int len = 0;
895 memset(buffer,0x0,buf_len);
896 while(TRUE){
897 try_count++;
898 seraddr_len = sizeof(struct sockaddr_in);
899 len = recvfrom(inter_info->fd,buffer,buf_len,0,&seraddr,&seraddr_len);
900 if(len < 0){
901 if(errno == EWOULDBLOCK){// No data can read.
902 if(count > 0) // Read data
903 break; // Read data end.
904
905 if(try_count >= times){ // Timeout
906 if(times == 0) {
907 LOGE("Can not read.");
908 } else {
909 LOGE("Timeout");
910 *mbtk_errno = MBTK_SOCK_ETIMEOUT;
911 }
912 count = -1;
913 LOGE("Not read enough data,return.[%d/%d]",count,buf_len);
914 break;
915 } else {
916 usleep(50000);
917 continue;
918 }
919 } else {
920 LOGE("recvfrom error.[%d]",errno);
921 if(count <= 0)
922 count = -1;
923 break;
924 }
925 } else if(len == 0) {
926 LOGE("write error(len == 0).[%d]",errno);
927 if(count <= 0)
928 count = 0;
929 break;
930 } else {
931 count += len;
932 }
933 }
934 } else {
935 LOGE("Socket type error.");
936 return -1;
937 }
938
939// if(count == buf_len){
940// LOGD("Read data[%d/%d] success.",count,buf_len);
941// } else { // Open session fail
942// LOGD("Read data[%d/%d] fail.",count,buf_len);
943// }
944
945 LOGV("Read data[%d/%d].",count,buf_len);
946
947 *mbtk_errno = MBTK_SOCK_SUCCESS;
948 return count;
949}
950extern int mbtk_sock_readline(mbtk_sock_handle handle,mbtk_sock_session session,
951 void *buffer,
952 unsigned int buf_len,
953 unsigned int timeout,
954 int *mbtk_errno,
955 int *read_line_count,
956 char *buf_ptr)
957{
958 if(handle < 0 || handle >= MBTK_HANDLE_MAX_NUM
959 || session < 0 || mbtk_sock[handle] == NULL) {
960 LOGE("Socket not inited.");
961 return -1;
962 }
963
964 *mbtk_errno = MBTK_SOCK_ERROR;
965 if(buffer == NULL) {
966 LOGE("mbtk_sock_write() args error.");
967 return -1;
968 }
969
970 mbtk_sock_inter_info_s *inter_info = NULL;
971 int index = 0;
972 while(index < MBTK_SOCK_MAX_NUM) {
973 if(session ==
974 mbtk_sock[handle]->inter_infos[index].fd) {
975 inter_info = &(mbtk_sock[handle]->inter_infos[index]);
976 break;
977 }
978 index++;
979 }
980
981 if(!sock_info_check(handle,inter_info)) {
982 LOGE("sock_info_check() fail.");
983 return -1;
984 }
985
986 index = sock_info_find_by_fd(handle,inter_info->fd);
987 if(index < 0) {
988 LOGE("No such socket in session list.");
989 return -1;
990 }
991
992 unsigned int count = 0;
993 unsigned int read_count = 0;
994 memset(buf_ptr, 0, buf_len);
995 char *temp_ptr = (char *)buffer;
996copy_angin_ssl:
997 while(*read_line_count > 0 && *temp_ptr != '\n') {
998 if(*temp_ptr == NULL)
999 {
1000 printf("\n*temp_ptr is null\n");
1001 goto read_end;
1002 }
1003 *buf_ptr++ = *temp_ptr++;
1004 (*read_line_count)--;
1005 count++;
1006 }
1007 if(*read_line_count == 0)
1008 {
1009 if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_TCP) {
1010 int len = 0;
1011 int try_count = 0;
1012 int times = timeout / 50;
1013 memset(buffer,0x0,buf_len);
1014 while(count < buf_len){
1015 try_count++;
1016 if( inter_info->ssl == NULL)
1017 printf("\ninter_info->ssl == NULL\n");
1018 if(mbtk_sock[handle]->infos[index].is_support_ssl)
1019 len = ssl_read(inter_info->ssl,(char*)buffer + count,buf_len - count);
1020 else
1021 len = read(inter_info->fd,(char*)buffer + count,buf_len - count);
1022 *read_line_count = len;
1023 if(len < 0){
1024 if(errno == EWOULDBLOCK){
1025 if(count > 0) // Read data
1026 {
1027 *read_line_count = count;
1028 count = 0;
1029 goto copy_angin_ssl;
1030 break; // Read data end.
1031 }
1032 else
1033 {
1034 //printf("\nread_end\n");
1035 goto read_end;
1036 }
1037 if(try_count >= times){ // Timeout
1038 count = -1;
1039 if(times != 0) {
1040 *mbtk_errno = MBTK_SOCK_ETIMEOUT;
1041 }
1042 LOGE("Not read enough data,return.[%d/%d]",count,buf_len);
1043 goto read_end;
1044 break;
1045 } else {
1046 usleep(50000);
1047 continue;
1048 }
1049 } else {
1050 LOGE("read error.[%d]",errno);
1051 if(count <= 0)
1052 count = -1;
1053 else {
1054 *read_line_count = count;
1055 }
1056 break;
1057 }
1058 } else if(len == 0) {
1059 LOGE("read error(len == 0).[%d]",errno);
1060 if(errno == EINPROGRESS) {
1061 if(close(inter_info->fd) == 0) {// Success
1062 LOGD("Socket disconnected.Close it.");
1063 }
1064 if(count <= 0)
1065 count = -1;
1066 } else {
1067 if(count <= 0)
1068 count = 0;
1069 else
1070 count = -1;
1071 }
1072 goto read_end;
1073 break;
1074 } else {
1075 count += len;
1076 }
1077 }
1078 } else if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_UDP) {
1079 // Start recv data
1080 struct sockaddr_in seraddr;
1081 socklen_t seraddr_len;
1082 int try_count = 0;
1083 int times = timeout / 50;
1084 int len = 0;
1085 memset(buffer,0x0,buf_len);
1086 while(TRUE){
1087 try_count++;
1088 seraddr_len = sizeof(struct sockaddr_in);
1089 len = recvfrom(inter_info->fd,buffer,buf_len,0,&seraddr,&seraddr_len);
1090 if(len < 0){
1091 if(errno == EWOULDBLOCK){// No data can read.
1092 if(count > 0) // Read data
1093 break; // Read data end.
1094
1095 if(try_count >= times){ // Timeout
1096 if(times == 0) {
1097 LOGE("Can not read.");
1098 //printf("Can not read.\n");
1099 } else {
1100 LOGE("Timeout");
1101 //printf("Timeout\n");
1102 *mbtk_errno = MBTK_SOCK_ETIMEOUT;
1103 }
1104 count = -1;
1105 LOGE("Not read enough data,return.[%d/%d]",count,buf_len);
1106 //printf("Not read enough data,return.[%d/%d]\n",count,buf_len);
1107 break;
1108 } else {
1109 usleep(50000);
1110 continue;
1111 }
1112 } else {
1113 LOGE("recvfrom error.[%d]",errno);
1114 if(count <= 0)
1115 count = -1;
1116 break;
1117 }
1118 } else if(len == 0) {
1119 LOGE("write error(len == 0).[%d]",errno);
1120 if(count <= 0)
1121 count = 0;
1122 break;
1123 } else {
1124 count += len;
1125 }
1126 }
1127 } else {
1128 LOGE("Socket type error.");
1129 //printf("Socket type error.\n");
1130 return -1;
1131 }
1132 count = 0;
1133 goto copy_angin_ssl;
1134 } else if(*temp_ptr == '\n') { // Read line.
1135 *buf_ptr++ = '\n';
1136 (*read_line_count)--;
1137 count++;
1138
1139 if(*read_line_count > 0)
1140 memcpy(buffer, temp_ptr + 1, *read_line_count);
1141 return count;
1142 }
1143 LOGV("Read data[%d/%d].",count,buf_len);
1144read_end:
1145 *mbtk_errno = MBTK_SOCK_SUCCESS;
1146 return count;
1147}
1148
1149extern int mbtk_sock_read_async(mbtk_sock_handle handle,mbtk_sock_session session,
1150 void *buffer,
1151 unsigned int buf_len)
1152{
1153 if(handle < 0 || handle >= MBTK_HANDLE_MAX_NUM
1154 || session < 0 || mbtk_sock[handle] == NULL) {
1155 LOGE("Socket not inited.");
1156 return -1;
1157 }
1158
1159 if(buffer == NULL) {
1160 LOGE("mbtk_sock_write() args error.");
1161 return -1;
1162 }
1163
1164 mbtk_sock_inter_info_s *inter_info = NULL;
1165 int index = 0;
1166 while(index < MBTK_SOCK_MAX_NUM) {
1167 if(session ==
1168 mbtk_sock[handle]->inter_infos[index].fd) {
1169 inter_info = &(mbtk_sock[handle]->inter_infos[index]);
1170 break;
1171 }
1172 index++;
1173 }
1174 if(!sock_info_check(handle,inter_info)) {
1175 LOGE("sock_info_check() fail.");
1176 return -1;
1177 }
1178
1179 index = sock_info_find_by_fd(handle,inter_info->fd);
1180 if(index < 0) {
1181 LOGE("No such socket in session list.");
1182 return -1;
1183 }
1184
1185 int len;
1186 if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_TCP) {
1187TCP_READ_AGAIN:
1188 memset(buffer,0x0,buf_len);
1189 if(mbtk_sock[handle]->infos[index].is_support_ssl)
1190 len = ssl_read(inter_info->ssl,(char*)buffer,buf_len);
1191 else
1192 len = read(inter_info->fd,(char*)buffer,buf_len);
1193 if(len < 0){
1194 if(errno == EWOULDBLOCK){
1195 usleep(100000);
1196 goto TCP_READ_AGAIN;
1197 } else {
1198 LOGE("read error.[%d]",errno);
1199 return -1;
1200 }
1201 }
1202 } else if(mbtk_sock[handle]->infos[index].type == MBTK_SOCK_UDP) {
1203 // Start recv data
1204 struct sockaddr_in seraddr;
1205 socklen_t seraddr_len;
1206UDP_READ_AGAIN:
1207 memset(buffer,0x0,buf_len);
1208 seraddr_len = sizeof(struct sockaddr_in);
1209 len = recvfrom(inter_info->fd,buffer,buf_len,0,&seraddr,&seraddr_len);
1210 if(len < 0){
1211 if(errno == EWOULDBLOCK){
1212 usleep(100000);
1213 goto UDP_READ_AGAIN;
1214 } else {
1215 LOGE("read error.[%d]",errno);
1216 return -1;
1217 }
1218 }
1219 } else {
1220 LOGE("Socket type error.");
1221 return -1;
1222 }
1223
1224 LOGV("Read data[%d/%d].",len,buf_len);
1225
1226 return len;
1227}
1228
1229extern int mbtk_sock_close(mbtk_sock_handle handle,mbtk_sock_session session,
1230 unsigned int timeout,
1231 int *mbtk_errno)
1232{
1233 if(handle < 0 || handle >= MBTK_HANDLE_MAX_NUM
1234 || session < 0 || mbtk_sock[handle] == NULL) {
1235 LOGE("Socket not inited.");
1236 return -1;
1237 }
1238
1239 *mbtk_errno = MBTK_SOCK_ERROR;
1240 mbtk_sock_inter_info_s *inter_info = NULL;
1241 int index = 0;
1242 while(index < MBTK_SOCK_MAX_NUM) {
1243 if(session == mbtk_sock[handle]->inter_infos[index].fd) {
1244 inter_info = &(mbtk_sock[handle]->inter_infos[index]);
1245 break;
1246 }
1247 index++;
1248 }
1249 if(!sock_info_check(handle,inter_info)) {
1250 LOGE("sock_info_check() fail.");
1251 return -1;
1252 }
1253
1254 index = sock_info_find_by_fd(handle,inter_info->fd);
1255 if(index < 0) {
1256 LOGE("No such socket in session list.");
1257 return -1;
1258 }
1259
1260 int i;
1261 for(i = 0;i < MBTK_SOCK_MAX_NUM;i++) {
1262 if(mbtk_sock[handle]->inter_infos[i].fd == inter_info->fd){
1263 if(mbtk_sock[handle]->init_info.sock_cb) {
1264 struct epoll_event ev;
1265 ev.data.fd = inter_info->fd;
1266 ev.events = EPOLLIN | EPOLLET;
1267 epoll_ctl(epoll_fd,EPOLL_CTL_DEL,inter_info->fd,&ev);
1268 }
1269
1270 if(close(inter_info->fd) < 0) {// Success
1271 LOGE("Close socket fail[%d].",errno);
1272 //break;
1273 }
1274 mbtk_sock[handle]->inter_infos[i].fd = -1;
1275 memset(&(mbtk_sock[handle]->infos[i]),0x0,sizeof(mbtk_sock_info));
1276 mbtk_sock[handle]->sock_num--;
1277 break;
1278 }
1279 }
1280
1281 if(mbtk_sock[handle]->infos[index].is_support_ssl){
1282 if(mbtk_ssl_close(inter_info)== -1)
1283 {
1284 LOGE("close ssl fail");
1285 return -1;
1286 }
1287 }
1288
1289 *mbtk_errno = MBTK_SOCK_SUCCESS;
1290 return 0;
1291}
1292
1293extern int mbtk_sock_deinit(mbtk_sock_handle handle)
1294{
1295 if(handle < 0 || handle >= MBTK_HANDLE_MAX_NUM
1296 || mbtk_sock[handle] == NULL) {
1297 LOGE("Socket not inited.");
1298 return -1;
1299 }
1300
1301 if(mbtk_sock[handle]->sock_num > 0) {
1302 LOGE("There are socket not close.");
1303 return MBTK_SOCK_ERROR;
1304 }
1305
1306 LOGD("mbtk_sock_deinit() start.");
1307#if 0
1308 sock_thread_running = FALSE;
1309 write(pipe_fds[0],"0",1);
1310
1311 // Wait for thread exist.
1312 while(sock_inited) {
1313 usleep(100);
1314 }
1315#endif
1316
1317 int i;
1318 for(i = 0;i < MBTK_SOCK_MAX_NUM;i++) {
1319 if(mbtk_sock[handle]->inter_infos[i].fd > 0){
1320 if(mbtk_sock[handle]->init_info.sock_cb) {
1321 struct epoll_event ev;
1322 ev.data.fd = mbtk_sock[handle]->inter_infos[i].fd;
1323 ev.events = EPOLLIN | EPOLLET;
1324 epoll_ctl(epoll_fd,EPOLL_CTL_DEL,mbtk_sock[handle]->inter_infos[i].fd,&ev);
1325 }
1326
1327 if(close(mbtk_sock[handle]->inter_infos[i].fd) < 0) {// Success
1328 LOGE("Close socket fail[%d].",errno);
1329 //break;
1330 }
1331 mbtk_sock[handle]->inter_infos[i].fd = -1;
1332 memset(&(mbtk_sock[handle]->infos[i]),0x0,sizeof(mbtk_sock_info));
1333 break;
1334 }
1335 }
1336
1337 //memset(&mbtk_sock,0x0,sizeof(mbtk_sock_s));
1338 free(mbtk_sock[handle]);
1339 mbtk_sock[handle] = NULL;
1340 LOGD("mbtk_sock_deinit() end.");
1341 return MBTK_SOCK_SUCCESS;
1342}
1343
1344