aboutsummaryrefslogtreecommitdiff
path: root/websocksy.c
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2019-05-18 13:12:46 +0200
committercbdev <cb@cbcdn.com>2019-05-18 13:12:46 +0200
commitff94e4518d417d88f2fabdfca7025e68ce21849b (patch)
tree22232e7187cf5e7e9b03be84691a2b4f12de0645 /websocksy.c
parentd28b5eb2960e80d80e967a3f01ce70e1fa457808 (diff)
downloadwebsocksy-ff94e4518d417d88f2fabdfca7025e68ce21849b.tar.gz
websocksy-ff94e4518d417d88f2fabdfca7025e68ce21849b.tar.bz2
websocksy-ff94e4518d417d88f2fabdfca7025e68ce21849b.zip
Complete WS connection establishment
Diffstat (limited to 'websocksy.c')
-rw-r--r--websocksy.c86
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);