diff runtime/net.c @ 142:7bbdc034e347

Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
author Mike Pavone <pavone@retrodev.com>
date Sun, 21 Nov 2010 16:33:17 -0500
parents
children e9a8269384bb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/net.c	Sun Nov 21 16:33:17 2010 -0500
@@ -0,0 +1,65 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <string.h>
+#include <stdio.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;
+}
+