| /* |
| * os_trans.c |
| * |
| * Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/ |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #include <netinet/in.h> |
| #include <sys/socket.h> |
| #include <sys/types.h> |
| #include <arpa/inet.h> |
| #include <unistd.h> |
| |
| |
| #include "cu_osapi.h" |
| #include "os_trans.h" |
| |
| TI_BOOL os_trans_create() |
| { |
| return TRUE; |
| } |
| |
| |
| TI_BOOL os_socket (THandle* pSock) |
| { |
| SOCKET socket_id; |
| TI_BOOL optval = TRUE; |
| |
| socket_id = socket(PF_INET, SOCK_STREAM, 0); |
| |
| if (socket_id==SOCKET_ERROR) |
| { |
| /* Error opening socket */ |
| os_error_printf(CU_MSG_ERROR, "%s: error opening socket.\n", __FUNCTION__); |
| return (FALSE); |
| } |
| |
| /*************************/ |
| /* Configure the socket */ |
| /***********************/ |
| |
| if (setsockopt(socket_id, SOL_SOCKET, SO_REUSEADDR, (const THandle)&optval, sizeof(optval)) == OSAL_ERROR) { |
| /* Error setting socket option */ |
| os_error_printf(CU_MSG_ERROR, "%s: error setting socket option. Error %d\n", __FUNCTION__, os_get_last_error()); |
| close(socket_id); //close socket |
| return FALSE; |
| } |
| |
| *pSock = (THandle) socket_id; |
| |
| return TRUE; |
| } |
| |
| |
| TI_BOOL os_bind (THandle sock, U16 port) |
| { |
| struct sockaddr_in server_addr; |
| TI_SIZE_T result; |
| |
| server_addr.sin_family = AF_INET; |
| server_addr.sin_addr.s_addr = htonl (INADDR_ANY); |
| server_addr.sin_port = htons(port); |
| |
| result = bind((SOCKET)sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); |
| |
| if (result != OK) { |
| /* Error binding socket */ |
| os_error_printf(CU_MSG_ERROR, "%s: error binding socket. Error %d\n", __FUNCTION__, os_get_last_error()); |
| close((SOCKET)sock); |
| return(FALSE); |
| } |
| |
| return TRUE; |
| } |
| |
| |
| TI_BOOL os_sockWaitForConnection (THandle socket_id, THandle* pConnSock) |
| { |
| struct sockaddr_in client_addr; |
| socklen_t client_addr_len; |
| TI_SIZE_T result; |
| |
| result = listen((SOCKET)socket_id, MAX_QUEUE_LENGTH); |
| |
| if (result == OSAL_ERROR) { |
| /* Error listening to socket */ |
| /* os_error_printf(CU_MSG_ERROR, "%s: error listening to socket. Error %d\n", __FUNCTION__, errno); |
| *pConnSock = NULL; |
| closesocket((SOCKET)socket_id); |
| return(FALSE);*/ |
| } |
| |
| /**********************/ |
| /* Accept connection */ |
| /********************/ |
| client_addr_len = sizeof(client_addr); |
| |
| /* We suppose to get new socket id after accept (blocking action) */ |
| result = accept((SOCKET)socket_id, (struct sockaddr *)&client_addr, &client_addr_len); |
| |
| if (result == OSAL_ERROR) { |
| *pConnSock = NULL; |
| /* Error accepting connection */ |
| os_error_printf(CU_MSG_ERROR, "%s: error accepting connection. Error %d\n", __FUNCTION__, os_get_last_error()); |
| close((SOCKET) socket_id); |
| return(FALSE); |
| } |
| |
| *pConnSock = (THandle) result; |
| |
| return TRUE; |
| } |
| |
| |
| TI_BOOL os_sockSend (THandle socket_id, PS8 buffer, U32 bufferSize) |
| { |
| TI_SIZE_T result; |
| |
| /* Write to the socket */ |
| result = send( (SOCKET) socket_id, buffer, (U32)bufferSize, 0); |
| if (result == SOCKET_ERROR) { |
| |
| /**************************/ |
| /* Error writing to port */ |
| /************************/ |
| os_error_printf(CU_MSG_ERROR, "%s: Error writing to socket (result = %d), error %d\n", |
| __FUNCTION__, result, os_get_last_error()); |
| |
| return FALSE; |
| } |
| |
| return TRUE; |
| } |
| |
| VOID os_trans_destroy() |
| { |
| |
| } |
| |
| S32 os_sockRecv (THandle socket_id, PU8 pBuffer, U32 bufferSize, TI_SIZE_T flags) |
| |
| { |
| TI_SIZE_T result; |
| |
| /* Read from the socket */ |
| result = recv((SOCKET)socket_id, pBuffer, bufferSize, flags); |
| if (result == SOCKET_ERROR) { |
| |
| /***************************/ |
| /* Error reading from port */ |
| /***************************/ |
| |
| os_error_printf(CU_MSG_ERROR, "%s: Error reading from socket (result = %d), error %d\n", __FUNCTION__, result, os_get_last_error()); |
| } |
| |
| return (S32)result; |
| } |
| |