view runtime/net.c @ 165:47ab97730865

Fix a couple of issues in networking lib
author Mike Pavone <pavone@retrodev.com>
date Thu, 10 Mar 2011 04:15:37 +0000
parents e9a8269384bb
children
line wrap: on
line source

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>

int _internal_accept(int sockfd, char * addrbuf, int buflen)
{
	int retfd;
	socklen_t addr_size;
	struct sockaddr_storage remote_addr;
	addr_size = sizeof(remote_addr);
	retfd = accept(sockfd, (struct sockaddr *)&remote_addr, &addr_size);
	if (addrbuf && buflen)
	{
		addrbuf[0] = '\0';
		if(retfd == -1)
			return retfd;
		switch(remote_addr.ss_family)
		{
		case AF_INET:
			inet_ntop(AF_INET, &(((struct sockaddr_in *)&remote_addr)->sin_addr), addrbuf, buflen);
			break;
		case AF_INET6:
			inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)&remote_addr)->sin6_addr), addrbuf, buflen);
			break;
		}
	}
	return retfd;
}


int _internal_bindnewsocket(unsigned int port, int setreuse)
{
	char portstr[6];
	int sockfd,flag=1;
	struct addrinfo hints, *localaddr;
	
	snprintf(portstr, 6, "%d", port & 0xFFFF);
	
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE;
	
	getaddrinfo(NULL, portstr, &hints, &localaddr);
	
	sockfd = socket(localaddr->ai_family, localaddr->ai_socktype, localaddr->ai_protocol);
	if (sockfd == -1)
	{
		freeaddrinfo(localaddr);
		return sockfd;
	}
	if(setreuse)
		setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,&flag,sizeof(int));
	if(-1 == bind(sockfd, localaddr->ai_addr, localaddr->ai_addrlen))
	{
		close(sockfd);
		sockfd = -1;
	}
	freeaddrinfo(localaddr);
	return sockfd;
}

int _internal_connectnewsocket(char * addr, int32_t port)
{
	char portstr[6];
	struct addrinfo hints, *res;
	int sock;
	
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	
	snprintf(portstr, 6, "%d", port & 0xFFFF);
	if(getaddrinfo(addr, portstr, &hints, &res))
		return -1;
	if(-1 == (sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)))
		return -1;
	
	if(connect(sock, res->ai_addr, res->ai_addrlen))
	{
		close(sock);
		sock = -1;
	}
	freeaddrinfo(res);	
	return sock;
}

int _internal_ignoresigpipe()
{
	struct sigaction act;
	memset(&act, 0, sizeof(act));
	act.sa_handler = SIG_IGN;
	return sigaction(SIGPIPE, &act, NULL);
}