Home | History | Annotate | Download | only in src
      1 /*
      2  * os_trans.c
      3  *
      4  * Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *     http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 #include <netinet/in.h>
     19 #include <sys/socket.h>
     20 #include <sys/types.h>
     21 #include <arpa/inet.h>
     22 #include <unistd.h>
     23 
     24 
     25 #include "cu_osapi.h"
     26 #include "os_trans.h"
     27 
     28 TI_BOOL os_trans_create()
     29 {
     30     return TRUE;
     31 }
     32 
     33 
     34 TI_BOOL os_socket (THandle* pSock)
     35 {
     36     SOCKET socket_id;
     37     TI_BOOL optval = TRUE;
     38 
     39     socket_id = socket(PF_INET, SOCK_STREAM, 0);
     40 
     41     if (socket_id==SOCKET_ERROR)
     42     {
     43         /* Error opening socket */
     44         os_error_printf(CU_MSG_ERROR, "%s: error opening socket.\n", __FUNCTION__);
     45         return (FALSE);
     46     }
     47 
     48     /*************************/
     49     /* Configure the socket */
     50     /***********************/
     51 
     52     if (setsockopt(socket_id, SOL_SOCKET, SO_REUSEADDR, (const THandle)&optval, sizeof(optval)) == OSAL_ERROR) {
     53         /* Error setting socket option */
     54         os_error_printf(CU_MSG_ERROR, "%s: error setting socket option. Error %d\n", __FUNCTION__, os_get_last_error());
     55         close(socket_id); //close socket
     56         return FALSE;
     57     }
     58 
     59     *pSock = (THandle) socket_id;
     60 
     61     return TRUE;
     62 }
     63 
     64 
     65 TI_BOOL os_bind (THandle sock, U16 port)
     66 {
     67     struct sockaddr_in server_addr;
     68     TI_SIZE_T result;
     69 
     70     server_addr.sin_family = AF_INET;
     71     server_addr.sin_addr.s_addr = htonl (INADDR_ANY);
     72     server_addr.sin_port = htons(port);
     73 
     74     result = bind((SOCKET)sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
     75 
     76     if (result != OK) {
     77         /* Error binding socket */
     78         os_error_printf(CU_MSG_ERROR, "%s: error binding socket. Error %d\n", __FUNCTION__, os_get_last_error());
     79         close((SOCKET)sock);
     80         return(FALSE);
     81     }
     82 
     83     return TRUE;
     84 }
     85 
     86 
     87 TI_BOOL os_sockWaitForConnection (THandle socket_id, THandle* pConnSock)
     88 {
     89     struct sockaddr_in client_addr;
     90     socklen_t client_addr_len;
     91     TI_SIZE_T result;
     92 
     93     result = listen((SOCKET)socket_id, MAX_QUEUE_LENGTH);
     94 
     95     if (result == OSAL_ERROR) {
     96         /* Error listening to socket */
     97         /*       os_error_printf(CU_MSG_ERROR, "%s: error listening to socket. Error %d\n", __FUNCTION__, errno);
     98         *pConnSock = NULL;
     99         closesocket((SOCKET)socket_id);
    100         return(FALSE);*/
    101     }
    102 
    103     /**********************/
    104     /* Accept connection */
    105     /********************/
    106     client_addr_len = sizeof(client_addr);
    107 
    108     /* We suppose to get new socket id after accept (blocking action) */
    109     result = accept((SOCKET)socket_id, (struct sockaddr *)&client_addr, &client_addr_len);
    110 
    111     if (result == OSAL_ERROR) {
    112         *pConnSock = NULL;
    113         /* Error accepting connection */
    114         os_error_printf(CU_MSG_ERROR, "%s: error accepting connection. Error %d\n", __FUNCTION__, os_get_last_error());
    115         close((SOCKET) socket_id);
    116         return(FALSE);
    117     }
    118 
    119     *pConnSock = (THandle) result;
    120 
    121     return TRUE;
    122 }
    123 
    124 
    125 TI_BOOL os_sockSend (THandle socket_id, PS8 buffer, U32 bufferSize)
    126 {
    127     TI_SIZE_T result;
    128 
    129     /* Write to the socket */
    130     result = send( (SOCKET) socket_id, buffer, (U32)bufferSize, 0);
    131     if (result == SOCKET_ERROR) {
    132 
    133         /**************************/
    134         /* Error writing to port */
    135         /************************/
    136         os_error_printf(CU_MSG_ERROR, "%s: Error writing to socket (result = %d), error %d\n",
    137             __FUNCTION__, result, os_get_last_error());
    138 
    139         return FALSE;
    140     }
    141 
    142     return TRUE;
    143 }
    144 
    145 VOID os_trans_destroy()
    146 {
    147 
    148 }
    149 
    150 S32 os_sockRecv (THandle socket_id, PU8 pBuffer, U32 bufferSize, TI_SIZE_T flags)
    151 
    152 {
    153     TI_SIZE_T result;
    154 
    155     /* Read from the socket */
    156     result = recv((SOCKET)socket_id, pBuffer, bufferSize, flags);
    157     if (result == SOCKET_ERROR) {
    158 
    159         /***************************/
    160         /* Error reading from port */
    161         /***************************/
    162 
    163         os_error_printf(CU_MSG_ERROR, "%s: Error reading from socket (result = %d), error %d\n", __FUNCTION__, result, os_get_last_error());
    164     }
    165 
    166     return (S32)result;
    167 }
    168 
    169