diff options
Diffstat (limited to 'tinyNET/src/tnet_transport_cfsocket.c')
-rwxr-xr-x | tinyNET/src/tnet_transport_cfsocket.c | 696 |
1 files changed, 346 insertions, 350 deletions
diff --git a/tinyNET/src/tnet_transport_cfsocket.c b/tinyNET/src/tnet_transport_cfsocket.c index 4115b22..ed844b6 100755 --- a/tinyNET/src/tnet_transport_cfsocket.c +++ b/tinyNET/src/tnet_transport_cfsocket.c @@ -55,25 +55,24 @@ #define TNET_BUFFER_STREAM_MIN_SIZE 1024 /*== Socket description ==*/ -typedef struct transport_socket_xs -{ +typedef struct transport_socket_xs { tnet_fd_t fd; tsk_bool_t owner; tsk_bool_t readable; tsk_bool_t writable; tsk_bool_t paused; tsk_bool_t is_client; - + tnet_proxy_node_t *proxy_node; tnet_proxyinfo_t* proxy_info; tsk_bool_t proxy_handshacking_completed; tsk_bool_t proxy_handshacking_started; - + char* dst_host; tnet_port_t dst_port; - + tnet_socket_type_t type; - + CFSocketRef cf_socket; CFReadStreamRef cf_read_stream; CFWriteStreamRef cf_write_stream; @@ -82,15 +81,14 @@ typedef struct transport_socket_xs transport_socket_xt; /*== Transport context structure definition ==*/ -typedef struct transport_context_s -{ +typedef struct transport_context_s { TSK_DECLARE_OBJECT; - + tsk_size_t count; transport_socket_xt* sockets[TNET_MAX_FDS]; - + CFRunLoopRef cf_run_loop; - + TSK_DECLARE_SAFEOBJ; } transport_context_t; @@ -114,32 +112,32 @@ static BOOL isTrusted(tnet_transport_t *transport, id cfStream, BOOL bReadStream SecCertificateRef certArray[2] = { NULL, NULL }; CFArrayRef refCertArray = NULL; CFIndex certArrayCount = 0; - + trust = bReadStream - ? (SecTrustRef)CFReadStreamCopyProperty((CFReadStreamRef)cfStream, kCFStreamPropertySSLPeerTrust) - : (SecTrustRef)CFWriteStreamCopyProperty((CFWriteStreamRef)cfStream, kCFStreamPropertySSLPeerTrust); + ? (SecTrustRef)CFReadStreamCopyProperty((CFReadStreamRef)cfStream, kCFStreamPropertySSLPeerTrust) + : (SecTrustRef)CFWriteStreamCopyProperty((CFWriteStreamRef)cfStream, kCFStreamPropertySSLPeerTrust); if (!trust) { TSK_DEBUG_ERROR("Failed to get SecTrustRef object from '%s' stream", bReadStream ? "read" : "write"); goto bail; } - + NSString *caName = NULL, *pbName = NULL; - + if (!tsk_strnullORempty(transport->tls.ca)) { - caName = [[[NSString stringWithCString:transport->tls.ca encoding: NSUTF8StringEncoding] lastPathComponent] stringByDeletingPathExtension]; +caName = [[[NSString stringWithCString:transport->tls.ca encoding: NSUTF8StringEncoding] lastPathComponent] stringByDeletingPathExtension]; } if (!tsk_strnullORempty(transport->tls.pbk)) { - pbName = [[[NSString stringWithCString:transport->tls.pbk encoding: NSUTF8StringEncoding] lastPathComponent] stringByDeletingPathExtension]; +pbName = [[[NSString stringWithCString:transport->tls.pbk encoding: NSUTF8StringEncoding] lastPathComponent] stringByDeletingPathExtension]; } TSK_DEBUG_INFO("SSL::isTrusted(ca=%s, pb=%s)", [caName UTF8String], [pbName UTF8String]); - + if (caName) { - NSString *caPath = [[NSBundle mainBundle] pathForResource:caName ofType:@"der"]; - if (![[NSFileManager defaultManager] fileExistsAtPath:caPath]) { +NSString *caPath = [[NSBundle mainBundle] pathForResource:caName ofType:@"der"]; +if (![[NSFileManager defaultManager] fileExistsAtPath:caPath]) { TSK_DEBUG_WARN("Cannot find SSL CA file '%s.der'", [caPath UTF8String]); } else { - NSData *certData = [[NSData alloc] initWithContentsOfFile:caPath]; +NSData *certData = [[NSData alloc] initWithContentsOfFile:caPath]; CFDataRef certDataRef = (CFDataRef)certData; SecCertificateRef cert = certDataRef ? SecCertificateCreateWithData(NULL, certDataRef) : NULL; [certData release]; @@ -153,12 +151,12 @@ static BOOL isTrusted(tnet_transport_t *transport, id cfStream, BOOL bReadStream } } if (pbName) { - NSString *pbPath = [[NSBundle mainBundle] pathForResource:pbName ofType:@"der"]; - if (![[NSFileManager defaultManager] fileExistsAtPath:pbPath]) { +NSString *pbPath = [[NSBundle mainBundle] pathForResource:pbName ofType:@"der"]; +if (![[NSFileManager defaultManager] fileExistsAtPath:pbPath]) { TSK_DEBUG_WARN("Cannot find SSL PUB file '%s.der'", [pbPath UTF8String]); } else { - NSData *certData = [[NSData alloc] initWithContentsOfFile:pbPath]; +NSData *certData = [[NSData alloc] initWithContentsOfFile:pbPath]; CFDataRef certDataRef = (CFDataRef)certData; SecCertificateRef cert = certDataRef ? SecCertificateCreateWithData(NULL, certDataRef) : NULL; [certData release]; @@ -191,7 +189,7 @@ static BOOL isTrusted(tnet_transport_t *transport, id cfStream, BOOL bReadStream } bTrusted = (result == kSecTrustResultProceed || result == kSecTrustResultUnspecified); TSK_DEBUG_INFO("SecTrustEvaluate result = %d", result); - + bail: CFRelease(trust); CFRelease(refCertArray); @@ -202,28 +200,28 @@ bail: static int recvData(tnet_transport_t *transport, transport_socket_xt* active_socket) { int ret; - if(!transport || !transport->context || !active_socket){ + if(!transport || !transport->context || !active_socket) { TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - + void* buffer = tsk_null; tsk_size_t len = 0; struct sockaddr_storage remote_addr = {0}; - + /* check whether the socket is paused or not */ if (active_socket->paused) { TSK_DEBUG_INFO("Socket is paused"); goto bail; } - + tsk_bool_t is_stream = TNET_SOCKET_TYPE_IS_STREAM(active_socket->type); - + if (tnet_ioctlt(active_socket->fd, FIONREAD, &len) < 0) { TNET_PRINT_LAST_ERROR("ioctl() failed"); goto bail; } - + if (!len) { // probably incoming connection if (is_stream && !active_socket->is_client) { @@ -235,26 +233,26 @@ static int recvData(tnet_transport_t *transport, transport_socket_xt* active_soc goto bail; } } - + if (is_stream && CFReadStreamHasBytesAvailable(active_socket->cf_read_stream)) { if ((buffer = tsk_calloc(TNET_BUFFER_STREAM_MIN_SIZE, sizeof(uint8_t)))) { len = CFReadStreamRead(active_socket->cf_read_stream, buffer, (CFIndex)TNET_BUFFER_STREAM_MIN_SIZE); ret = (int)len; } } - + if (ret <= 0) { TSK_DEBUG_WARN("ioctl() returned zero for fd=%d", active_socket->fd); goto bail; } } - + if (len && !buffer) { - if(!(buffer = tsk_calloc(len, sizeof(uint8_t)))){ + if(!(buffer = tsk_calloc(len, sizeof(uint8_t)))) { TSK_DEBUG_ERROR("calloc(%zu) failed", len); goto bail; } - + // Receive the waiting data if (is_stream) { ret = tnet_getpeername(active_socket->fd, &remote_addr); @@ -269,23 +267,23 @@ static int recvData(tnet_transport_t *transport, transport_socket_xt* active_soc ret = tnet_sockfd_recvfrom(active_socket->fd, buffer, len, 0, (struct sockaddr*)&remote_addr); } } - - - if(ret < 0){ + + + if(ret < 0) { removeSocket(active_socket, transport->context); TNET_PRINT_LAST_ERROR("recv/recvfrom have failed."); goto bail; } - + if ((len != (tsk_size_t)ret) && len) { len = (tsk_size_t)ret; } - + if (!active_socket->proxy_handshacking_completed && active_socket->proxy_handshacking_started && active_socket->proxy_node && active_socket->proxy_info) { void* handshaking_data_ptr = tsk_null; tsk_size_t handshaking_data_size = 0; TSK_DEBUG_INFO("Proxy handshaking data:%.*s", (int)len, buffer); - + // handle incoming hadshaking data if ((ret = tnet_proxy_node_set_handshaking_data(active_socket->proxy_node, buffer, len)) != 0) { TSK_RUNNABLE_ENQUEUE(transport, event_error, transport->callback_data, active_socket->fd); @@ -318,18 +316,19 @@ static int recvData(tnet_transport_t *transport, transport_socket_xt* active_soc } goto bail; // do not forward the data to the end-user } - + if (len && buffer) { tnet_transport_event_t* e = tnet_transport_event_create(event_data, transport->callback_data, active_socket->fd); if (e && buffer && len) { - e->data = buffer; buffer = NULL; + e->data = buffer; + buffer = NULL; e->size = len; e->remote_addr = remote_addr; - + TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(transport), e); } } - + bail: TSK_FREE(buffer); return 0; @@ -341,31 +340,31 @@ int tnet_transport_add_socket_2(const tnet_transport_handle_t *handle, tnet_fd_t transport_context_t* context; int ret = -1; (void)(tlsHandle); - + if (!transport) { TSK_DEBUG_ERROR("Invalid server handle."); return ret; } - + if (!(context = (transport_context_t*)transport->context)) { TSK_DEBUG_ERROR("Invalid context."); return -2; } - - if(TNET_SOCKET_TYPE_IS_TLS(type) || TNET_SOCKET_TYPE_IS_WSS(type)){ + + if(TNET_SOCKET_TYPE_IS_TLS(type) || TNET_SOCKET_TYPE_IS_WSS(type)) { transport->tls.enabled = 1; } - + if ((ret = addSocket2(fd, type, transport, take_ownership, isClient, dst_host, dst_port, proxy_info))) { TSK_DEBUG_ERROR("Failed to add new Socket."); return ret; } - + if (context->cf_run_loop) { // Signal the run-loop CFRunLoopWakeUp(context->cf_run_loop); } - + return 0; } @@ -377,23 +376,24 @@ int tnet_transport_add_socket(const tnet_transport_handle_t *handle, tnet_fd_t f return tnet_transport_add_socket_2(handle, fd, type, take_ownership, isClient, tlsHandle, __dst_host_null, __dst_port_zero, __proxy_info_null); } -int tnet_transport_pause_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd, tsk_bool_t pause){ +int tnet_transport_pause_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd, tsk_bool_t pause) +{ tnet_transport_t *transport = (tnet_transport_t*)handle; transport_context_t *context; transport_socket_xt* socket; - - if(!transport || !(context = (transport_context_t *)transport->context)){ + + if(!transport || !(context = (transport_context_t *)transport->context)) { TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - - if((socket = (transport_socket_xt*)getSocket(context, fd))){ + + if((socket = (transport_socket_xt*)getSocket(context, fd))) { socket->paused = pause; } else { TSK_DEBUG_WARN("Failed to find socket with fd=%d", (int)fd); } - + return 0; } @@ -404,19 +404,19 @@ int tnet_transport_remove_socket(const tnet_transport_handle_t *handle, tnet_fd_ transport_context_t *context; tsk_size_t i; tsk_bool_t found = tsk_false; - + if (!transport || !fd) { TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - + TSK_DEBUG_INFO("Removing socket %d", *fd); - + if (!(context = (transport_context_t*)transport->context)) { TSK_DEBUG_ERROR("Invalid context."); return -2; } - + for(i=0; i<context->count; ++i) { if (context->sockets[i]->fd == *fd) { removeSocketAtIndex((int)i, context); @@ -425,15 +425,15 @@ int tnet_transport_remove_socket(const tnet_transport_handle_t *handle, tnet_fd_ break; } } - + if (found && context->cf_run_loop) { // Signal the run-loop CFRunLoopWakeUp(context->cf_run_loop); return 0; } - + // ... - + return -1; } @@ -441,29 +441,29 @@ tsk_size_t tnet_transport_send(const tnet_transport_handle_t *handle, tnet_fd_t { tnet_transport_t *transport = (tnet_transport_t*)handle; int numberOfBytesSent = 0; - + if (!transport) { TSK_DEBUG_ERROR("Invalid transport handle."); goto bail; } - + const transport_socket_xt* sock = getSocket(transport->context, from); if (sock && sock->cf_write_stream && TNET_SOCKET_TYPE_IS_STREAM(sock->type) && sock->cf_write_stream) { int sent = 0, to_send; const uint8_t* buff_ptr = (const uint8_t*)buf; // on iOS when TLS is enabled sending more than 1024 bytes could fails static const int max_size_to_send = 1024; - + to_send = (int)TSK_MIN(max_size_to_send, size); - + if (CFWriteStreamGetStatus(sock->cf_write_stream) == kCFStreamStatusNotOpen) { - if(!CFWriteStreamOpen(sock->cf_write_stream)){ + if(!CFWriteStreamOpen(sock->cf_write_stream)) { TSK_DEBUG_ERROR("CFWriteStreamOpen() failed"); return numberOfBytesSent; } } if (CFReadStreamGetStatus(sock->cf_read_stream) == kCFStreamStatusNotOpen) { - if(!CFReadStreamOpen(sock->cf_read_stream)){ + if(!CFReadStreamOpen(sock->cf_read_stream)) { TSK_DEBUG_ERROR("CFReadStreamOpen() failed"); return numberOfBytesSent; } @@ -472,17 +472,18 @@ tsk_size_t tnet_transport_send(const tnet_transport_handle_t *handle, tnet_fd_t numberOfBytesSent += sent; to_send = (int)TSK_MIN(max_size_to_send, (size - numberOfBytesSent)); } - if(sent < 0){ + if(sent < 0) { TNET_PRINT_LAST_ERROR("Send have failed"); goto bail; } - } else { + } + else { if ((numberOfBytesSent = (int)send(from, buf, size, 0)) < size) { TNET_PRINT_LAST_ERROR("Send have failed"); goto bail; } } - + bail: return numberOfBytesSent; } @@ -491,17 +492,17 @@ tsk_size_t tnet_transport_sendto(const tnet_transport_handle_t *handle, tnet_fd_ { tnet_transport_t *transport = (tnet_transport_t*)handle; int numberOfBytesSent = 0, ret; - + if (!transport) { TSK_DEBUG_ERROR("Invalid server handle"); goto bail; } - + if (!TNET_SOCKET_TYPE_IS_DGRAM(transport->master->type)) { TSK_DEBUG_ERROR("In order to use sendto you must use an udp transport"); goto bail; } - + while (numberOfBytesSent < size && (ret = (int)sendto(from, buf, size, 0, to, tnet_get_sockaddr_size(to))) >= 0) { numberOfBytesSent += ret; } @@ -514,7 +515,7 @@ tsk_size_t tnet_transport_sendto(const tnet_transport_handle_t *handle, tnet_fd_ TNET_PRINT_LAST_ERROR("sendto(fd=%d) have failed", from); } } - + bail: return numberOfBytesSent; } @@ -522,20 +523,20 @@ bail: int tnet_transport_have_socket(const tnet_transport_handle_t *handle, tnet_fd_t fd) { tnet_transport_t *transport = (tnet_transport_t*)handle; - + if (!transport) { TSK_DEBUG_ERROR("Invalid server handle."); return 0; } - + return (getSocket((transport_context_t*)transport->context, fd) != 0); } const tnet_tls_socket_handle_t* tnet_transport_get_tlshandle(const tnet_transport_handle_t *handle, tnet_fd_t fd) { tnet_transport_t *transport = (tnet_transport_t*)handle; - - if(!transport){ + + if(!transport) { TSK_DEBUG_ERROR("Invalid parameter"); return 0; } @@ -548,7 +549,7 @@ static const transport_socket_xt* getSocket(transport_context_t *context, tnet_f { tsk_size_t i; transport_socket_xt* ret = tsk_null; - + if (context) { tsk_safeobj_lock(context); for(i=0; i<context->count; i++) { @@ -559,14 +560,14 @@ static const transport_socket_xt* getSocket(transport_context_t *context, tnet_f } tsk_safeobj_unlock(context); } - + return ret; } static const transport_socket_xt* getSocketByStream(transport_context_t *context, void* cf_stream) { tsk_size_t i; transport_socket_xt* ret = tsk_null; - + if (context) { tsk_safeobj_lock(context); for(i=0; i<context->count; i++) { @@ -577,13 +578,14 @@ static const transport_socket_xt* getSocketByStream(transport_context_t *context } tsk_safeobj_unlock(context); } - + return ret; } /*== Add new socket ==*/ -int addSocket2(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport, tsk_bool_t take_ownership, tsk_bool_t is_client , const char* dst_host, tnet_port_t dst_port, struct tnet_proxyinfo_s* proxy_info) { +int addSocket2(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport, tsk_bool_t take_ownership, tsk_bool_t is_client , const char* dst_host, tnet_port_t dst_port, struct tnet_proxyinfo_s* proxy_info) +{ transport_context_t *context = transport?transport->context:0; if (context) { transport_socket_xt *sock = tsk_calloc(1, sizeof(transport_socket_xt)); @@ -596,24 +598,24 @@ int addSocket2(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transpor if (dst_host && dst_port && tnet_proxyinfo_is_valid(proxy_info)) { sock->proxy_info = tsk_object_ref(proxy_info); } - + if (!sock) { TSK_DEBUG_ERROR("Failed to allocate socket"); return -1; } - + tsk_safeobj_lock(context); wrapSocket(transport, sock); context->sockets[context->count] = sock; context->count++; - + tsk_safeobj_unlock(context); - + TSK_DEBUG_INFO("Socket added"); - + return 0; } - else{ + else { TSK_DEBUG_ERROR("Context is Null."); return -1; } @@ -631,19 +633,19 @@ int addSocket(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport int removeSocketAtIndex(int index, transport_context_t *context) { int i; - + tsk_safeobj_lock(context); - + if (index < (int)context->count) { transport_socket_xt *sock = context->sockets[index]; tnet_fd_t fd = sock->fd; - + // Remove from runloop if (context->cf_run_loop && sock->cf_run_loop_source) { CFRunLoopRemoveSource(context->cf_run_loop, sock->cf_run_loop_source, kCFRunLoopCommonModes); CFRelease(sock->cf_run_loop_source), sock->cf_run_loop_source = NULL; } - + // Invalidate CFSocket if (sock->cf_socket) { if (CFSocketIsValid(sock->cf_socket)) { @@ -652,7 +654,7 @@ int removeSocketAtIndex(int index, transport_context_t *context) CFRelease(sock->cf_socket); sock->cf_socket = NULL; } - + // Close and free write stream if (sock->cf_write_stream) { if (CFWriteStreamGetStatus(sock->cf_write_stream) != kCFStreamStatusClosed) { @@ -661,7 +663,7 @@ int removeSocketAtIndex(int index, transport_context_t *context) CFRelease(sock->cf_write_stream); sock->cf_write_stream = NULL; } - + // Close and free read stream if (sock->cf_read_stream) { if (CFReadStreamGetStatus(sock->cf_read_stream) != kCFStreamStatusClosed) { @@ -670,38 +672,38 @@ int removeSocketAtIndex(int index, transport_context_t *context) CFRelease(sock->cf_read_stream); sock->cf_read_stream = NULL; } - + // Close the socket if we are the owner. if (sock->owner) { tnet_sockfd_close(&(sock->fd)); } - + TSK_FREE(sock->dst_host); TSK_OBJECT_SAFE_FREE(sock->proxy_node); TSK_OBJECT_SAFE_FREE(sock->proxy_info); TSK_FREE(sock); - + for (i = index ; i<context->count-1; ++i) { context->sockets[i] = context->sockets[i+1]; } - + context->sockets[context->count-1] = tsk_null; context->count--; - + TSK_DEBUG_INFO("Socket removed: %d", fd); } - + tsk_safeobj_unlock(context); - + return 0; } int removeSocket(transport_socket_xt *value, transport_context_t *context) { int i; - + tsk_safeobj_lock(context); - + for(i = 0; i < context->count; i++) { transport_socket_xt *sock = context->sockets[i]; if (sock == value) { @@ -709,9 +711,9 @@ int removeSocket(transport_socket_xt *value, transport_context_t *context) break; } } - + tsk_safeobj_unlock(context); - + return 0; } @@ -719,19 +721,19 @@ int tnet_transport_stop(tnet_transport_t *transport) { int ret; transport_context_t *context; - + if (!transport) { TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - + context = transport->context; - + if ((ret = tsk_runnable_stop(TSK_RUNNABLE(transport)))) { return ret; } - - if(transport->mainThreadId[0]){ + + if(transport->mainThreadId[0]) { if (context && context->cf_run_loop) { // Signal the run-loop CFRunLoopWakeUp(context->cf_run_loop); @@ -747,29 +749,29 @@ int tnet_transport_prepare(tnet_transport_t *transport) { int ret = -1; transport_context_t *context; - + if (!transport || !(context = transport->context)) { TSK_DEBUG_ERROR("Invalid parameter."); return -1; } - + if (transport->prepared) { TSK_DEBUG_ERROR("Transport already prepared."); return -2; } - + /* Prepare master */ - if(!transport->master){ - if((transport->master = tnet_socket_create(transport->local_host, transport->req_local_port, transport->type))){ + if(!transport->master) { + if((transport->master = tnet_socket_create(transport->local_host, transport->req_local_port, transport->type))) { tsk_strupdate(&transport->local_ip, transport->master->ip); transport->bind_local_port = transport->master->port; } - else{ + else { TSK_DEBUG_ERROR("Failed to create master socket"); return -3; } } - + /* Start listening */ if (TNET_SOCKET_TYPE_IS_STREAM(transport->master->type)) { if ((ret = tnet_sockfd_listen(transport->master->fd, TNET_MAX_FDS))) { @@ -777,7 +779,7 @@ int tnet_transport_prepare(tnet_transport_t *transport) goto bail; } } - + /* Add the master socket to the context. */ // don't take ownership: will be closed by the dtor() when refCount==0 // otherwise will be cosed twice: dtor() and removeSocket @@ -785,281 +787,275 @@ int tnet_transport_prepare(tnet_transport_t *transport) TSK_DEBUG_ERROR("Failed to add master socket"); goto bail; } - + transport->prepared = tsk_true; - + bail: return ret; } -int tnet_transport_unprepare(tnet_transport_t *transport){ +int tnet_transport_unprepare(tnet_transport_t *transport) +{ transport_context_t *context; - - if(!transport || !(context = transport->context)){ + + if(!transport || !(context = transport->context)) { TSK_DEBUG_ERROR("Invalid parameter."); return -1; } - - if(!transport->prepared){ + + if(!transport->prepared) { return 0; } - + transport->prepared = tsk_false; - - while(context->count){ + + while(context->count) { removeSocketAtIndex(0, context); // safe } - + // destroy master as it has been closed by removeSocket() TSK_OBJECT_SAFE_FREE(transport->master); - + return 0; } -void __CFReadStreamClientCallBack(CFReadStreamRef stream, CFStreamEventType eventType, void *clientCallBackInfo) { +void __CFReadStreamClientCallBack(CFReadStreamRef stream, CFStreamEventType eventType, void *clientCallBackInfo) +{ // Extract the context tnet_transport_t *transport = (tnet_transport_t *) clientCallBackInfo; transport_context_t *context = transport->context; - + /* lock context */ tsk_safeobj_lock(context); - + // Extract the native socket CFDataRef data = CFReadStreamCopyProperty(stream, kCFStreamPropertySocketNativeHandle); transport_socket_xt *sock = tsk_null; - if(data){ + if(data) { CFSocketNativeHandle fd; CFDataGetBytes(data, CFRangeMake(0, sizeof(CFSocketNativeHandle)), (UInt8*) &fd); CFRelease(data); sock = (transport_socket_xt *) getSocket(context, fd); - } else if (eventType == kCFStreamEventErrorOccurred) { // this event returns null data + } + else if (eventType == kCFStreamEventErrorOccurred) { // this event returns null data sock = (transport_socket_xt *) getSocketByStream(context, stream); } - + if(!sock) { goto bail; } - + switch(eventType) { - case kCFStreamEventOpenCompleted: - { - TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> kCFStreamEventOpenCompleted(fd=%d)", sock->fd); + case kCFStreamEventOpenCompleted: { + TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> kCFStreamEventOpenCompleted(fd=%d)", sock->fd); #if 0 - // Check SSL certificates - if (TNET_SOCKET_TYPE_IS_TLS(sock->type) && transport->tls.verify) { - if (!isTrusted(transport, (__bridge id)stream, YES/*YES read stream*/)) { - TSK_DEBUG_ERROR("Remote SSL certs not trusted...closing the write stream"); - TSK_RUNNABLE_ENQUEUE(transport, event_closed, transport->callback_data, sock->fd); - removeSocket(sock, context); - break; - } + // Check SSL certificates + if (TNET_SOCKET_TYPE_IS_TLS(sock->type) && transport->tls.verify) { + if (!isTrusted(transport, (__bridge id)stream, YES/*YES read stream*/)) { + TSK_DEBUG_ERROR("Remote SSL certs not trusted...closing the write stream"); + TSK_RUNNABLE_ENQUEUE(transport, event_closed, transport->callback_data, sock->fd); + removeSocket(sock, context); + break; } + } #endif - // Set "readable" flag - if (!sock->readable) { - sock->readable = tsk_true; - if (sock->writable) { - if (!sock->proxy_info || sock->proxy_handshacking_completed) { - // no proxy or handshaking not done yet - TSK_RUNNABLE_ENQUEUE(transport, event_connected, transport->callback_data, sock->fd); - } - else if (sock->proxy_info && !sock->proxy_handshacking_started) { - // proxy handshaking not done yet - sock->proxy_handshacking_started = tsk_true; - startProxyHandshaking(transport, sock); - } + // Set "readable" flag + if (!sock->readable) { + sock->readable = tsk_true; + if (sock->writable) { + if (!sock->proxy_info || sock->proxy_handshacking_completed) { + // no proxy or handshaking not done yet + TSK_RUNNABLE_ENQUEUE(transport, event_connected, transport->callback_data, sock->fd); + } + else if (sock->proxy_info && !sock->proxy_handshacking_started) { + // proxy handshaking not done yet + sock->proxy_handshacking_started = tsk_true; + startProxyHandshaking(transport, sock); } } - break; - } - case kCFStreamEventEndEncountered: - { - TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> kCFStreamEventEndEncountered(fd=%d)", sock->fd); - TSK_RUNNABLE_ENQUEUE(transport, event_closed, transport->callback_data, sock->fd); - removeSocket(sock, context); - break; - } - case kCFStreamEventHasBytesAvailable: - { - recvData(transport, sock); - break; - } - case kCFStreamEventErrorOccurred: - { - // Get the error code - CFErrorRef error = CFReadStreamCopyError(stream); - if (error) { - TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> Error=%lu -> %s, fd=%d, status=%ld", CFErrorGetCode(error), CFStringGetCStringPtr(CFErrorGetDomain(error), kCFStringEncodingUTF8), sock->fd, CFReadStreamGetStatus(stream)); - CFRelease(error); - } - - TSK_RUNNABLE_ENQUEUE(transport, event_error, transport->callback_data, sock->fd); - removeSocket(sock, context); - break; } - default: - { - // Not Implemented - TSK_DEBUG_WARN("Not implemented"); - break; + break; + } + case kCFStreamEventEndEncountered: { + TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> kCFStreamEventEndEncountered(fd=%d)", sock->fd); + TSK_RUNNABLE_ENQUEUE(transport, event_closed, transport->callback_data, sock->fd); + removeSocket(sock, context); + break; + } + case kCFStreamEventHasBytesAvailable: { + recvData(transport, sock); + break; + } + case kCFStreamEventErrorOccurred: { + // Get the error code + CFErrorRef error = CFReadStreamCopyError(stream); + if (error) { + TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> Error=%lu -> %s, fd=%d, status=%ld", CFErrorGetCode(error), CFStringGetCStringPtr(CFErrorGetDomain(error), kCFStringEncodingUTF8), sock->fd, CFReadStreamGetStatus(stream)); + CFRelease(error); } + + TSK_RUNNABLE_ENQUEUE(transport, event_error, transport->callback_data, sock->fd); + removeSocket(sock, context); + break; + } + default: { + // Not Implemented + TSK_DEBUG_WARN("Not implemented"); + break; + } } - + /* unlock context */ bail: tsk_safeobj_unlock(context); } -void __CFWriteStreamClientCallBack(CFWriteStreamRef stream, CFStreamEventType eventType, void *clientCallBackInfo) { +void __CFWriteStreamClientCallBack(CFWriteStreamRef stream, CFStreamEventType eventType, void *clientCallBackInfo) +{ // Extract the context tnet_transport_t *transport = (tnet_transport_t *) clientCallBackInfo; transport_context_t *context = transport->context; - + /* lock context */ tsk_safeobj_lock(context); - + // Extract the native socket CFDataRef data = CFWriteStreamCopyProperty(stream, kCFStreamPropertySocketNativeHandle); transport_socket_xt *sock = tsk_null; - if(data){ + if(data) { CFSocketNativeHandle fd; CFDataGetBytes(data, CFRangeMake(0, sizeof(CFSocketNativeHandle)), (UInt8*) &fd); CFRelease(data); sock = (transport_socket_xt *) getSocket(context, fd); - } else if (eventType == kCFStreamEventErrorOccurred) { // this event returns null data + } + else if (eventType == kCFStreamEventErrorOccurred) { // this event returns null data sock = (transport_socket_xt *) getSocketByStream(context, stream); } - + if(!sock) { goto bail; } - + switch(eventType) { - case kCFStreamEventOpenCompleted: - { - TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> kCFStreamEventOpenCompleted(fd=%d)", sock->fd); - // still not connected, see kCFStreamEventCanAcceptBytes - break; + case kCFStreamEventOpenCompleted: { + TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> kCFStreamEventOpenCompleted(fd=%d)", sock->fd); + // still not connected, see kCFStreamEventCanAcceptBytes + break; + } + case kCFStreamEventCanAcceptBytes: { + // To avoid blocking, call this function only if CFWriteStreamCanAcceptBytes returns true or after the stream’s client (set with CFWriteStreamSetClient) is notified of a kCFStreamEventCanAcceptBytes event. + TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> kCFStreamEventCanAcceptBytes(fd=%d)", sock->fd); + // Check SSL certificates + if (TNET_SOCKET_TYPE_IS_TLS(sock->type) && transport->tls.verify) { + if (!isTrusted(transport, (__bridge id)stream, FALSE/*NOT read stream*/)) { + TSK_DEBUG_ERROR("Remote SSL certs not trusted...closing the write stream"); + removeSocket(sock, context); + break; + } } - case kCFStreamEventCanAcceptBytes: - { - // To avoid blocking, call this function only if CFWriteStreamCanAcceptBytes returns true or after the stream’s client (set with CFWriteStreamSetClient) is notified of a kCFStreamEventCanAcceptBytes event. - TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> kCFStreamEventCanAcceptBytes(fd=%d)", sock->fd); - // Check SSL certificates - if (TNET_SOCKET_TYPE_IS_TLS(sock->type) && transport->tls.verify) { - if (!isTrusted(transport, (__bridge id)stream, FALSE/*NOT read stream*/)) { - TSK_DEBUG_ERROR("Remote SSL certs not trusted...closing the write stream"); - removeSocket(sock, context); - break; + // Set "writable" flag + if (!sock->writable) { + sock->writable = tsk_true; + if (sock->readable) { + if (!sock->proxy_info || sock->proxy_handshacking_completed) { + // no proxy or handshaking not done yet + TSK_RUNNABLE_ENQUEUE(transport, event_connected, transport->callback_data, sock->fd); } - } - // Set "writable" flag - if (!sock->writable) { - sock->writable = tsk_true; - if (sock->readable) { - if (!sock->proxy_info || sock->proxy_handshacking_completed) { - // no proxy or handshaking not done yet - TSK_RUNNABLE_ENQUEUE(transport, event_connected, transport->callback_data, sock->fd); - } - else if (sock->proxy_info && !sock->proxy_handshacking_started) { - // proxy handshaking not done yet - sock->proxy_handshacking_started = tsk_true; - startProxyHandshaking(transport, sock); - } + else if (sock->proxy_info && !sock->proxy_handshacking_started) { + // proxy handshaking not done yet + sock->proxy_handshacking_started = tsk_true; + startProxyHandshaking(transport, sock); } } - break; - } - case kCFStreamEventEndEncountered: - { - TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> kCFStreamEventEndEncountered(fd=%d)", sock->fd); - TSK_RUNNABLE_ENQUEUE(transport, event_closed, transport->callback_data, sock->fd); - removeSocket(sock, context); - break; } - case kCFStreamEventErrorOccurred: - { - // Get the error code - CFErrorRef error = CFWriteStreamCopyError(stream); - if (error) { - TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> Error=%lu -> %s, fd=%d", CFErrorGetCode(error), CFStringGetCStringPtr(CFErrorGetDomain(error), kCFStringEncodingUTF8), sock->fd); - CFRelease(error); - } - - TSK_RUNNABLE_ENQUEUE(transport, event_error, transport->callback_data, sock->fd); - removeSocket(sock, context); - break; - } - default: - { - // Not Implemented - TSK_DEBUG_ERROR("Not implemented"); - break; + break; + } + case kCFStreamEventEndEncountered: { + TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> kCFStreamEventEndEncountered(fd=%d)", sock->fd); + TSK_RUNNABLE_ENQUEUE(transport, event_closed, transport->callback_data, sock->fd); + removeSocket(sock, context); + break; + } + case kCFStreamEventErrorOccurred: { + // Get the error code + CFErrorRef error = CFWriteStreamCopyError(stream); + if (error) { + TSK_DEBUG_INFO("__CFWriteStreamClientCallBack --> Error=%lu -> %s, fd=%d", CFErrorGetCode(error), CFStringGetCStringPtr(CFErrorGetDomain(error), kCFStringEncodingUTF8), sock->fd); + CFRelease(error); } + + TSK_RUNNABLE_ENQUEUE(transport, event_error, transport->callback_data, sock->fd); + removeSocket(sock, context); + break; + } + default: { + // Not Implemented + TSK_DEBUG_ERROR("Not implemented"); + break; + } } - + /* unlock context */ bail: tsk_safeobj_unlock(context); } -void __CFSocketCallBack(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info) { +void __CFSocketCallBack(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info) +{ // Extract the context tnet_transport_t *transport = (tnet_transport_t *) info; transport_context_t *context = transport->context; - + // Extract the native socket int fd = CFSocketGetNative(s); transport_socket_xt *sock = (transport_socket_xt *) getSocket(context, fd); - if(!sock) goto bail; - + if(!sock) { + goto bail; + } + /* lock context */ tsk_safeobj_lock(context); - + switch (callbackType) { - case kCFSocketReadCallBack: - { - recvData(transport, sock); - break; - } - case kCFSocketAcceptCallBack: - case kCFSocketConnectCallBack: - case kCFSocketWriteCallBack: - { - TSK_DEBUG_INFO("__CFSocketCallBack(fd=%d), callbackType=%lu", sock->fd, callbackType); - wrapSocket(transport, sock); - break; - } - case kCFSocketDataCallBack: - { - if (data) { - const UInt8 *ptr = CFDataGetBytePtr((CFDataRef)data); - int len = (int)CFDataGetLength((CFDataRef)data); - if (ptr && len > 0) { - tnet_transport_event_t* e = tnet_transport_event_create(event_data, transport->callback_data, sock->fd); - if (e) { - e->data = tsk_malloc(len); - if (e->data) { - memcpy(e->data, ptr, len); - e->size = len; - } - struct sockaddr* address_ = (struct sockaddr*)CFDataGetBytePtr(address); - memcpy(&e->remote_addr, address_, tnet_get_sockaddr_size(address_)); - TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(transport), e); + case kCFSocketReadCallBack: { + recvData(transport, sock); + break; + } + case kCFSocketAcceptCallBack: + case kCFSocketConnectCallBack: + case kCFSocketWriteCallBack: { + TSK_DEBUG_INFO("__CFSocketCallBack(fd=%d), callbackType=%lu", sock->fd, callbackType); + wrapSocket(transport, sock); + break; + } + case kCFSocketDataCallBack: { + if (data) { + const UInt8 *ptr = CFDataGetBytePtr((CFDataRef)data); + int len = (int)CFDataGetLength((CFDataRef)data); + if (ptr && len > 0) { + tnet_transport_event_t* e = tnet_transport_event_create(event_data, transport->callback_data, sock->fd); + if (e) { + e->data = tsk_malloc(len); + if (e->data) { + memcpy(e->data, ptr, len); + e->size = len; } + struct sockaddr* address_ = (struct sockaddr*)CFDataGetBytePtr(address); + memcpy(&e->remote_addr, address_, tnet_get_sockaddr_size(address_)); + TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(transport), e); } } - break; - } - - default: - { - // Not Implemented - TSK_DEBUG_ERROR("Not implemented"); - break; } + break; } - + + default: { + // Not Implemented + TSK_DEBUG_ERROR("Not implemented"); + break; + } + } + /* unlock context */ bail: tsk_safeobj_unlock(context); @@ -1076,52 +1072,53 @@ int wrapSocket(tnet_transport_t *transport, transport_socket_xt *sock) TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - + // If the socket is already wrapped in a CFSocket or mainthead not started yet then return if (!context->cf_run_loop) { return 0; } - + // Put a reference to the transport context const CFSocketContext socket_context = { 0, transport, NULL, NULL, NULL }; - + // Wrap socket and listen to events if (!sock->cf_socket && !sock->cf_read_stream && !sock->cf_write_stream) { sock->cf_socket = CFSocketCreateWithNative(kCFAllocatorDefault, - sock->fd, - kCFSocketReadCallBack | kCFSocketConnectCallBack | kCFSocketWriteCallBack | kCFSocketAcceptCallBack | kCFSocketDataCallBack, - &__CFSocketCallBack, - &socket_context); - + sock->fd, + kCFSocketReadCallBack | kCFSocketConnectCallBack | kCFSocketWriteCallBack | kCFSocketAcceptCallBack | kCFSocketDataCallBack, + &__CFSocketCallBack, + &socket_context); + // Don't close the socket if the CFSocket is invalidated CFOptionFlags flags = CFSocketGetSocketFlags(sock->cf_socket); flags = flags & ~kCFSocketCloseOnInvalidate; CFSocketSetSocketFlags(sock->cf_socket, flags); - + // Create a new RunLoopSource and register it with the main thread RunLoop sock->cf_run_loop_source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, sock->cf_socket, 0); CFRunLoopAddSource(context->cf_run_loop, sock->cf_run_loop_source, kCFRunLoopCommonModes); } - + if (TNET_SOCKET_TYPE_IS_DGRAM(sock->type)) { // Nothing to do - - } else if (TNET_SOCKET_TYPE_IS_STREAM(sock->type)) { + + } + else if (TNET_SOCKET_TYPE_IS_STREAM(sock->type)) { if (!sock->cf_read_stream && !sock->cf_write_stream) { // Create a pair of streams (read/write) from the socket CFStreamCreatePairWithSocket(kCFAllocatorDefault, sock->fd, &sock->cf_read_stream, &sock->cf_write_stream); - + // Don't close underlying socket CFReadStreamSetProperty(sock->cf_read_stream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); CFWriteStreamSetProperty(sock->cf_write_stream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); - + // Mark the stream for VoIP usage CFReadStreamSetProperty(sock->cf_read_stream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); CFWriteStreamSetProperty(sock->cf_write_stream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - + // Setup a context for the streams CFStreamClientContext streamContext = { 0, transport, NULL, NULL, NULL }; - + // Set the client callback for the stream CFReadStreamSetClient(sock->cf_read_stream, kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, @@ -1131,18 +1128,18 @@ int wrapSocket(tnet_transport_t *transport, transport_socket_xt *sock) kCFStreamEventOpenCompleted | kCFStreamEventErrorOccurred | kCFStreamEventCanAcceptBytes |kCFStreamEventEndEncountered, &__CFWriteStreamClientCallBack, &streamContext); - + if (TNET_SOCKET_TYPE_IS_TLS(sock->type)) { if ((ret = enableSSL(transport, sock)) != 0) { return ret; } } - + // Enroll streams in the run-loop CFReadStreamScheduleWithRunLoop(sock->cf_read_stream, context->cf_run_loop, kCFRunLoopCommonModes); CFWriteStreamScheduleWithRunLoop(sock->cf_write_stream, context->cf_run_loop, kCFRunLoopCommonModes); } - + // Open streams only if ready (otherwise, fails on iOS8) if (tnet_sockfd_waitUntilReadable(sock->fd, 1) == 0 || tnet_sockfd_waitUntilWritable(sock->fd, 1) == 0) { // switch from cf_socket to streams @@ -1155,11 +1152,11 @@ int wrapSocket(tnet_transport_t *transport, transport_socket_xt *sock) CFRelease(sock->cf_socket); sock->cf_socket = NULL; } - + should_open_streams = tsk_true; } } - + // Proxy if (sock->proxy_info) { if (sock->proxy_node && sock->proxy_node->type != sock->proxy_info->type) { @@ -1178,7 +1175,7 @@ int wrapSocket(tnet_transport_t *transport, transport_socket_xt *sock) TNET_PROXY_SET_SOCKET(sock->fd, sock->type), TNET_PROXY_NODE_SET_NULL()); } - + // Open streams if (should_open_streams) { if (!CFReadStreamOpen(sock->cf_read_stream)) { @@ -1198,7 +1195,7 @@ int wrapSocket(tnet_transport_t *transport, transport_socket_xt *sock) TSK_DEBUG_INFO("CFWriteStreamOpen(fd=%d) returned with status=%ld", sock->fd, status); } } - + return 0; } @@ -1213,7 +1210,7 @@ static int enableSSL(tnet_transport_t *transport, transport_socket_xt *sock) CFReadStreamSetProperty(sock->cf_read_stream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL); CFWriteStreamSetProperty(sock->cf_write_stream, kCFStreamSSLLevel, kCFStreamSocketSecurityLevelNegotiatedSSL); CFReadStreamSetProperty(sock->cf_read_stream, kCFStreamSSLLevel, kCFStreamSocketSecurityLevelNegotiatedSSL); - + CFMutableDictionaryRef settings = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); #if (__IPHONE_OS_VERSION_MIN_REQUIRED < 40000) // @Deprecated CFDictionaryAddValue(settings, kCFStreamSSLAllowsExpiredCertificates, kCFBooleanTrue); @@ -1223,11 +1220,11 @@ static int enableSSL(tnet_transport_t *transport, transport_socket_xt *sock) CFDictionaryAddValue(settings, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse); CFDictionaryAddValue(settings, kCFStreamSSLIsServer, sock->is_client ? kCFBooleanFalse : kCFBooleanTrue); CFDictionaryAddValue(settings, kCFStreamSSLPeerName, kCFNull); - + // Set the SSL settings CFReadStreamSetProperty(sock->cf_read_stream, kCFStreamPropertySSLSettings, settings); CFWriteStreamSetProperty(sock->cf_write_stream, kCFStreamPropertySSLSettings, settings); - + CFRelease(settings); } return 0; @@ -1239,12 +1236,12 @@ static int startProxyHandshaking(tnet_transport_t *transport, transport_socket_x int ret; void* handshaking_data_ptr = tsk_null; tsk_size_t handshaking_data_size = 0; - + if (!transport || !(context = transport->context) || !sock || !sock->proxy_info || !sock->proxy_node) { TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - + // start handshaking if ((ret = tnet_proxy_node_start_handshaking(sock->proxy_node)) != 0) { return ret; @@ -1260,7 +1257,7 @@ static int startProxyHandshaking(tnet_transport_t *transport, transport_socket_x TSK_FREE(handshaking_data_ptr); // check if handshaking completed tnet_proxy_node_get_handshaking_completed(sock->proxy_node, &sock->proxy_handshacking_completed); - + return ret; } @@ -1270,15 +1267,15 @@ void *tnet_transport_mainthread(void *param) tnet_transport_t *transport = param; transport_context_t *context = transport->context; int i; - + /* check whether the transport is already prepared */ if (!transport->prepared) { TSK_DEBUG_ERROR("Transport must be prepared before strating."); goto bail; } - + TSK_DEBUG_INFO("Starting [%s] server with IP {%s} on port {%d} with fd {%d}...", transport->description, transport->master->ip, transport->master->port, transport->master->fd); - + // Set the RunLoop of the context context->cf_run_loop = CFRunLoopGetCurrent(); CFRetain(context->cf_run_loop); @@ -1288,22 +1285,22 @@ void *tnet_transport_mainthread(void *param) wrapSocket(transport, context->sockets[i]); } tsk_safeobj_unlock(context); - + while(TSK_RUNNABLE(transport)->running) { // Give some time to process sources CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, false); - + if (!TSK_RUNNABLE(transport)->running) { goto bail; } } - + // Remove all the sockets, streams and sources from the run loop tsk_safeobj_lock(context); for(i = 0; i < context->count; i++) { transport_context_t *context = transport->context; transport_socket_xt *sock = context->sockets[i]; - + if (!sock) { continue; } @@ -1320,11 +1317,11 @@ void *tnet_transport_mainthread(void *param) } } tsk_safeobj_unlock(context); - - + + bail: TSK_DEBUG_INFO("Stopped [%s] server with IP {%s} on port {%d}...", transport->description, transport->master->ip, transport->master->port); - if(context->cf_run_loop){ + if(context->cf_run_loop) { CFRelease(context->cf_run_loop); context->cf_run_loop = NULL; } @@ -1357,7 +1354,7 @@ static tsk_object_t* transport_context_ctor(tsk_object_t * self, va_list * app) } static tsk_object_t* transport_context_dtor(tsk_object_t * self) -{ +{ transport_context_t *context = self; if (context) { while(context->count) { @@ -1368,12 +1365,11 @@ static tsk_object_t* transport_context_dtor(tsk_object_t * self) return self; } -static const tsk_object_def_t tnet_transport_context_def_s = -{ +static const tsk_object_def_t tnet_transport_context_def_s = { sizeof(transport_context_t), - transport_context_ctor, + transport_context_ctor, transport_context_dtor, - tsk_null, + tsk_null, }; const tsk_object_def_t *tnet_transport_context_def_t = &tnet_transport_context_def_s; |