/*
* Copyright (c) 2016-2020 Belledonne Communications SARL.
*
* This file is part of bctoolbox.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef BCTBX_VCONNECT
#define BCTBX_VCONNECT
#include
#include
#if !defined(_WIN32_WCE)
#include
#include
#if _MSC_VER
#include
#endif
#endif /*_WIN32_WCE*/
#ifndef _WIN32
#include
#endif
#define BCTBX_VCONNECT_OK 0 /* Successful result */
#define BCTBX_VCONNECT_ERROR -255 /* Some kind of socket error occurred */
#ifdef __cplusplus
extern "C"{
#endif
/**
* Methods associated with the bctbx_vsocket_api_t.
*/
typedef struct bctbx_vsocket_methods_t bctbx_vsocket_methods_t;
/**
* Methods pointer prototypes for the socket functions.
*/
struct bctbx_vsocket_methods_t {
bctbx_socket_t (*pFuncSocket)(int socket_family, int socket_type, int protocol);
int (*pFuncConnect)(bctbx_socket_t sock, const struct sockaddr *address, socklen_t address_len);
int (*pFuncBind)(bctbx_socket_t sock, const struct sockaddr *address, socklen_t address_len);
int (*pFuncGetSockName)(bctbx_socket_t sockfd, struct sockaddr *addr, socklen_t *addrlen);
int (*pFuncGetSockOpt)(bctbx_socket_t sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int (*pFuncSetSockOpt)(bctbx_socket_t sockfd, int level, int optname,
const void *optval, socklen_t optlen);
int (*pFuncClose)(bctbx_socket_t sock);
char* (*pFuncGetError)(int err);
int (*pFuncShutdown)(bctbx_socket_t sock, int how);
};
/**
* Socket API structure definition
*/
typedef struct bctbx_vsocket_api_t bctbx_vsocket_api_t;
struct bctbx_vsocket_api_t {
const char *vSockName; /* Socket API name */
const bctbx_vsocket_methods_t *pSocketMethods; /* Pointer to the socket methods structure */
};
/**===================================================
* Socket API methods prototypes.
* The default implementation relies on libc methods.
*====================================================*/
/**
* Creates a socket.
* @param socket_family type of address structure
* @param socket_type socket type i.e SOCK_STREAM
* @param protocol protocol family i.e AF_INET
* @return Returns a socket file descriptor.
*/
BCTBX_PUBLIC bctbx_socket_t bctbx_socket(int socket_family, int socket_type, int protocol);
/**
* Get the local socket address.
* Calls the function pointer pFuncGetSockName. The default method associated with this pointer
* is getsockname.
* @param sockfd socket descriptor
* @param addr buffer holding the current address to which the socket sockfd is bound
* @param addrlen amount of space (in bytes) pointed to by addr
* @return On success, zero is returned. On error, -1 is returned, and errno is
* set appropriately.
*/
BCTBX_PUBLIC int bctbx_getsockname(bctbx_socket_t sockfd, struct sockaddr *addr, socklen_t *addrlen);
/**
* Get socket options.
* @param sockfd socket file descriptor
* @param level level of the socket option
* @param optname name of the option
* @param optval buffer in which the value for the requested option(s) are to be returned
* @param optlen contains the size of the buffer pointed to by optval, and on return
* contains the actual size of the value returned.
* @return On success, zero is returned. On error, -1 is returned, and errno is
* set appropriately.
*/
BCTBX_PUBLIC int bctbx_getsockopt(bctbx_socket_t sockfd, int level, int optname,
void *optval, socklen_t *optlen);
/**
* Set socket options.
* @param sockfd socket file descriptor
* @param level level of the socket option
* @param optname name of the option
* @param optval buffer holding the value for the requested option
* @param optlen contains the size of the buffer pointed to by optval
* @return On success, zero is returned. On error, -1 is returned, and errno is
* set appropriately.
*/
BCTBX_PUBLIC int bctbx_setsockopt(bctbx_socket_t sockfd, int level, int optname,
const void *optval, socklen_t optlen);
/**
* Shut down part of a full duplex connection.
* @param sockfd socket file descriptor
* @param how specifies what is shut down in the connection.
* @return On success, zero is returned. On error, -1 is returned, and errno is
* set appropriately.
*/
BCTBX_PUBLIC int bctbx_shutdown(bctbx_socket_t sockfd, int how);
/**
* Close a socket file descriptor.
* @param sockfd socket file descriptor
* @return 0 on success , -1 on error and errno is set.
*/
BCTBX_PUBLIC int bctbx_socket_close(bctbx_socket_t sockfd);
/**
* Assign a name to a socket.
* @param sockfd socket file descriptor to assign the name to.
* @param address address of the socket
* @param address_len size of the address structure pointed to by address (bytes)
* @return On success, zero is returned. On error, -1 is returned, and errno is
* set appropriately.
*/
BCTBX_PUBLIC int bctbx_bind(bctbx_socket_t sockfd, const struct sockaddr *address, socklen_t address_len);
/**
* Initialize a connection to a socket.
* @param sockfd socket file descriptor
* @param address address of the socket
* @param address_len size of the address structure pointed to by address (bytes)
* @return On success, zero is returned. On error, -1 is returned, and errno is
* set appropriately.
*/
BCTBX_PUBLIC int bctbx_connect(bctbx_socket_t sockfd, const struct sockaddr *address, socklen_t address_len);
/**
* strerror equivalent.
* When an error is returned on a socket operations, returns
* the error description based on err (errno) value.
* @param err should be set to errno
* @return Error description
*/
BCTBX_PUBLIC char* bctbx_socket_error(int err);
/**
* Set default bctbx_vsocket_api_t pointer pDefaultvSocket to my_vsocket_api
* if it is not NULL, sets it to the standard API implementation otherwise.
* By default, the global pointer is set to use bcvSocket implemented in vconnect.c
* @param my_vsocket_api Pointer to a bctbx_vsocket_api_t structure.
*/
BCTBX_PUBLIC void bctbx_vsocket_api_set_default(bctbx_vsocket_api_t *my_vsocket_api);
/**
* Returns the value of the global variable pDefaultvSocket,
* pointing to the default bctbx_vsocket_api_t used.
* @return Pointer to bctbx_vsocket_api_t set to operate as default.
*/
BCTBX_PUBLIC bctbx_vsocket_api_t* bctbx_vsocket_api_get_default(void);
/**
* Return pointer to standard bctbx_vsocket_api_t implementation based on libc
* functions.
* @return pointer to bcSocketAPI
*/
BCTBX_PUBLIC bctbx_vsocket_api_t* bctbx_vsocket_api_get_standard(void);
#ifdef __cplusplus
}
#endif
#endif /* BCTBX_VCONNECT */