From ff94e4518d417d88f2fabdfca7025e68ce21849b Mon Sep 17 00:00:00 2001 From: cbdev Date: Sat, 18 May 2019 13:12:46 +0200 Subject: Complete WS connection establishment --- websocksy.c | 86 +++---------------------------------------------------------- 1 file changed, 3 insertions(+), 83 deletions(-) (limited to 'websocksy.c') diff --git a/websocksy.c b/websocksy.c index f193ae6..ca7193b 100644 --- a/websocksy.c +++ b/websocksy.c @@ -10,6 +10,7 @@ #include #include "websocksy.h" +#include "network.c" #include "ws_proto.c" /* TODO @@ -36,89 +37,6 @@ int args_parse(int argc, char** argv){ return 0; } -int network_socket(char* host, char* port, int socktype, int listener){ - int fd = -1, status, yes = 1, flags; - struct addrinfo hints = { - .ai_family = AF_UNSPEC, - .ai_socktype = socktype, - .ai_flags = (listener ? AI_PASSIVE : 0) - }; - struct addrinfo *info, *addr_it; - - status = getaddrinfo(host, port, &hints, &info); - if(status){ - fprintf(stderr, "Failed to parse address %s port %s: %s\n", host, port, gai_strerror(status)); - return -1; - } - - //traverse the result list - for(addr_it = info; addr_it; addr_it = addr_it->ai_next){ - fd = socket(addr_it->ai_family, addr_it->ai_socktype, addr_it->ai_protocol); - if(fd < 0){ - continue; - } - - //set required socket options - yes = 1; - if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(yes)) < 0){ - fprintf(stderr, "Failed to enable SO_REUSEADDR on socket: %s\n", strerror(errno)); - } - - yes = 0; - if(setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&yes, sizeof(yes)) < 0){ - fprintf(stderr, "Failed to unset IPV6_V6ONLY on socket: %s\n", strerror(errno)); - } - - //TODO loop, bcast for udp - - if(listener){ - status = bind(fd, addr_it->ai_addr, addr_it->ai_addrlen); - if(status < 0){ - close(fd); - continue; - } - } - else{ - status = connect(fd, addr_it->ai_addr, addr_it->ai_addrlen); - if(status < 0){ - close(fd); - continue; - } - } - - break; - } - freeaddrinfo(info); - - if(!addr_it){ - fprintf(stderr, "Failed to create socket for %s port %s\n", host, port); - return -1; - } - - //set nonblocking - flags = fcntl(fd, F_GETFL, 0); - if(fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0){ - fprintf(stderr, "Failed to set socket nonblocking: %s\n", strerror(errno)); - close(fd); - return -1; - } - - if(!listener){ - return fd; - } - - if(socktype == SOCK_STREAM){ - status = listen(fd, SOMAXCONN); - if(status < 0){ - fprintf(stderr, "Failed to listen on socket: %s\n", strerror(errno)); - close(fd); - return -1; - } - } - - return fd; -} - int ws_peer_data(websocket* ws){ //TODO return -1; @@ -139,6 +57,8 @@ int main(int argc, char** argv){ exit(usage(argv[0])); } + signal(SIGINT, signal_handler); + //core loop while(!shutdown_requested){ FD_ZERO(&read_fds); -- cgit v1.2.3