blob: 5a3232712b223f1b4a25add0949313764ac65b24 [file] [log] [blame]
/*------------------------------------------------------------
(C) Copyright [2006-2008] Marvell International Ltd.
All Rights Reserved
------------------------------------------------------------*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/un.h>
#include <linux/tcp.h>
#include <fcntl.h>
#include <errno.h>
#include <netinet/in.h>
#include <include/log.h>
#include "bipsocket.h"
#define FALSE 0
#define TRUE 1
#define DPRINTF(fmt, args ...) do{RERRMSG("BIP-"fmt, ##args);}while(0)
void MTIL_CloseSocket(IN OUT SOCKET_DESC * sock, char *path)
{
if (*sock != -1) {
close(*sock);
}
*sock = -1;
if (path && path[0]) {
unlink(path);
}
}
unsigned char MTIL_Accept(IN SOCKET_DESC mainSock, OUT SOCKET_DESC * sessionSock)
{
struct sockaddr_in addr;
int len;
len = sizeof(addr);
memset(&addr, 0, len);
*sessionSock = accept(mainSock, (struct sockaddr *)&addr, (socklen_t *) & len);
if (*sessionSock == SOCKET_ERROR) {
return FALSE;
}
return TRUE;
}
unsigned char MTIL_Listen(IN SOCKET_DESC mainSock, IN int backlog)
{
if (listen(mainSock, backlog) == SOCKET_ERROR)
return FALSE;
return TRUE;
}
unsigned char MTIL_Connect(IN SOCKET_DESC sock, struct sockaddr * addrTo, IN int addrlen)
{
if ((connect(sock, addrTo, addrlen)) == 0)
return TRUE;
return FALSE;
}
unsigned char MTIL_RecvSock(SOCKET_DESC sock, char *rcvBuf, int *bufSize, long waitSec, struct sockaddr * from, int from_len)
{
int rcvBytes;
(void)waitSec;
if (sock == -1)
return FALSE;
if (from) {
if ((rcvBytes = recvfrom(sock, rcvBuf, *bufSize, 0, from, (socklen_t *) & from_len)) <= 0) {
sleep(2);
return FALSE;
}
} else {
if ((rcvBytes = recv(sock, rcvBuf, *bufSize, 0)) <= 0) {
if (errno != 0)
sleep(2);
return FALSE;
}
}
DPRINTF("%s recv %d bytes", __FUNCTION__, rcvBytes);
*bufSize = rcvBytes;
return TRUE;
}
unsigned char MTIL_SendSock(SOCKET_DESC sock, char *sndBuf, int sndSize, struct sockaddr * to)
{
int sent = 0;
int lento = 0;
if (to && to->sa_family == AF_UNIX)
lento = sizeof(struct sockaddr_un);
else if (to && to->sa_family == AF_INET6)
lento = sizeof(struct sockaddr_in6);
else
lento = sizeof(struct sockaddr_in);
DPRINTF("%s send %d bytes", __FUNCTION__, sndSize);
while (sndSize) {
if (to)
sent = sendto(sock, sndBuf + sent, sndSize, 0, to, lento);
else
sent = send(sock, sndBuf + sent, sndSize, 0);
if (sent < 0) {
if (errno == EINTR)
continue;
return FALSE;
} else {
if (sent == 0) {
}
}
sndSize -= sent;
}
return TRUE;
}
int MTIL_GetLastSocketError()
{
#if !defined BIONIC
extern int errno;
#endif
return errno;
}