Mercurial > repos > rhope
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; +} +