diff options
author | cbdev <cb@cbcdn.com> | 2019-05-18 13:12:46 +0200 |
---|---|---|
committer | cbdev <cb@cbcdn.com> | 2019-05-18 13:12:46 +0200 |
commit | ff94e4518d417d88f2fabdfca7025e68ce21849b (patch) | |
tree | 22232e7187cf5e7e9b03be84691a2b4f12de0645 /websocksy.c | |
parent | d28b5eb2960e80d80e967a3f01ce70e1fa457808 (diff) | |
download | websocksy-ff94e4518d417d88f2fabdfca7025e68ce21849b.tar.gz websocksy-ff94e4518d417d88f2fabdfca7025e68ce21849b.tar.bz2 websocksy-ff94e4518d417d88f2fabdfca7025e68ce21849b.zip |
Complete WS connection establishment
Diffstat (limited to 'websocksy.c')
-rw-r--r-- | websocksy.c | 86 |
1 files changed, 3 insertions, 83 deletions
diff --git a/websocksy.c b/websocksy.c index f193ae6..ca7193b 100644 --- a/websocksy.c +++ b/websocksy.c @@ -10,6 +10,7 @@ #include <fcntl.h> #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); |