|
@@ -52,29 +52,29 @@ nethandler getNethandler(const int ipv6, const int port){
|
|
|
nethandler h = (nethandler)malloc(sizeof(s_nethandler));
|
|
|
h->ipv6 = ipv6;
|
|
|
if(ipv6){
|
|
|
- h->s = socket(AF_INET6, SOCK_STREAM, 0);
|
|
|
+ h->fd = socket(AF_INET6, SOCK_STREAM, 0);
|
|
|
}else{
|
|
|
- h->s = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
+ h->fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
}
|
|
|
int optval = 1;
|
|
|
- setsockopt(h->s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
|
|
|
+ setsockopt(h->fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
|
|
|
int e, en;
|
|
|
if(ipv6){
|
|
|
struct sockaddr_in6 add;
|
|
|
add.sin6_family = AF_INET6;
|
|
|
zero6addr(add.sin6_addr.s6_addr);
|
|
|
add.sin6_port = htons(port);
|
|
|
- e = bind(h->s, (struct sockaddr*) &add, sizeof(add));
|
|
|
+ e = bind(h->fd, (struct sockaddr*) &add, sizeof(add));
|
|
|
}else{
|
|
|
struct sockaddr_in add;
|
|
|
add.sin_family = AF_INET;
|
|
|
add.sin_addr.s_addr = INADDR_ANY;
|
|
|
add.sin_port = htons(port);
|
|
|
- e = bind(h->s, (struct sockaddr*) &add, sizeof(add));
|
|
|
+ e = bind(h->fd, (struct sockaddr*) &add, sizeof(add));
|
|
|
}
|
|
|
if(e)
|
|
|
return clear(h);
|
|
|
- e = listen(h->s, DEFAULT_LISTENNING_QUEUE);
|
|
|
+ e = listen(h->fd, DEFAULT_LISTENNING_QUEUE);
|
|
|
if(e)
|
|
|
return clear(h);
|
|
|
return h;
|
|
@@ -88,13 +88,14 @@ nethandler getPort(const int port){
|
|
|
return getNethandler(1, port);
|
|
|
}
|
|
|
|
|
|
-fileDs createFromFile(int f){
|
|
|
- fileDs d = (fileDs)malloc(sizeof(s_fileDs));
|
|
|
- d->f = f;
|
|
|
+ds createFromFile(int f){
|
|
|
+ ds d = (ds)malloc(sizeof(s_ds));
|
|
|
+ d->tp = file;
|
|
|
+ d->fd = f;
|
|
|
return d;
|
|
|
}
|
|
|
|
|
|
-fileDs createFromFileName(const char *f){
|
|
|
+ds createFromFileName(const char *f){
|
|
|
int fd = open(f, O_CREAT | O_RDWR);
|
|
|
if(fd == -1){
|
|
|
return NULL;
|
|
@@ -102,25 +103,27 @@ fileDs createFromFileName(const char *f){
|
|
|
return createFromFile(fd);
|
|
|
}
|
|
|
|
|
|
-sockDs createFromHandler(nethandler h){
|
|
|
- sockDs d = (sockDs)malloc(sizeof(s_sockDs));
|
|
|
+ds createFromHandler(nethandler h){
|
|
|
+ ds d = (ds)malloc(sizeof(s_ds));
|
|
|
+ d->tp = sock;
|
|
|
unsigned int s = sizeof(d->peer);
|
|
|
- d->s = accept(h->s, (struct sockaddr*)&(d->peer), &s);
|
|
|
- if(d->s <= 0)
|
|
|
+ d->fd = accept(h->fd, (struct sockaddr*)&(d->peer), &s);
|
|
|
+ if(d->fd <= 0)
|
|
|
return clear(d);
|
|
|
d->ipv6 = d->peer.ss_family == AF_INET6;
|
|
|
d->server = 1;
|
|
|
return d;
|
|
|
}
|
|
|
|
|
|
-sockDs createToHost(struct sockaddr *add, const int add_size, const int ipv6){
|
|
|
- sockDs d = (sockDs)malloc(sizeof(s_sockDs));
|
|
|
+ds createToHost(struct sockaddr *add, const int add_size, const int ipv6){
|
|
|
+ ds d = (ds)malloc(sizeof(s_ds));
|
|
|
+ d->tp = sock;
|
|
|
if(ipv6){
|
|
|
- d->s = socket(AF_INET6, SOCK_STREAM, 0);
|
|
|
+ d->fd = socket(AF_INET6, SOCK_STREAM, 0);
|
|
|
}else{
|
|
|
- d->s = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
+ d->fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
}
|
|
|
- if(connect(d->s, add, add_size) < 0){
|
|
|
+ if(connect(d->fd, add, add_size) < 0){
|
|
|
int e = errno;
|
|
|
free(d);
|
|
|
errno = e;
|
|
@@ -130,7 +133,7 @@ sockDs createToHost(struct sockaddr *add, const int add_size, const int ipv6){
|
|
|
return d;
|
|
|
}
|
|
|
|
|
|
-sockDs createToIPv4Host(const unsigned long host, const int port){
|
|
|
+ds createToIPv4Host(const unsigned long host, const int port){
|
|
|
struct sockaddr_in add;
|
|
|
add.sin_family = AF_INET;
|
|
|
add.sin_port = htons(port);
|
|
@@ -138,7 +141,7 @@ sockDs createToIPv4Host(const unsigned long host, const int port){
|
|
|
return createToHost((struct sockaddr*) &add, sizeof(add), 0);
|
|
|
}
|
|
|
|
|
|
-sockDs createToIPv6Host(const unsigned char host[16], const int port){
|
|
|
+ds createToIPv6Host(const unsigned char host[16], const int port){
|
|
|
struct sockaddr_in6 add;
|
|
|
add.sin6_family = AF_INET6;
|
|
|
add.sin6_port = htons(port);
|
|
@@ -148,11 +151,11 @@ sockDs createToIPv6Host(const unsigned char host[16], const int port){
|
|
|
return createToHost((struct sockaddr*) &add, sizeof(add), 1);
|
|
|
}
|
|
|
|
|
|
-int getPeer(sockDs d, unsigned long *ipv4peer, unsigned char ipv6peer[16], int *ipv6){
|
|
|
+int getPeer(ds d, unsigned long *ipv4peer, unsigned char ipv6peer[16], int *ipv6){
|
|
|
int port = 0;
|
|
|
struct sockaddr_storage peer;
|
|
|
int peer_size = sizeof(peer);
|
|
|
- if(getpeername(d->s, (struct sockaddr*)&peer, &peer_size)){
|
|
|
+ if(getpeername(d->fd, (struct sockaddr*)&peer, &peer_size)){
|
|
|
return 0;
|
|
|
}
|
|
|
if(peer.ss_family == AF_INET){
|
|
@@ -171,11 +174,8 @@ int getPeer(sockDs d, unsigned long *ipv4peer, unsigned char ipv6peer[16], int *
|
|
|
return port;
|
|
|
}
|
|
|
|
|
|
-int fileDsSend(fileDs d, const char *b, const int s){
|
|
|
- return write(d->f, b, s);
|
|
|
-}
|
|
|
-int sockDsSend(sockDs d, const char *b, const int s){
|
|
|
- return write(d->s, b, s);
|
|
|
+int sendDs(ds d, const char *b, const int s){
|
|
|
+ return write(d->fd, b, s);
|
|
|
}
|
|
|
int tlsDsSend(tlsDs d, const char *b, const int s){
|
|
|
return SSL_write(d->s, b, s);
|
|
@@ -184,11 +184,8 @@ int stdDsSend(const char *b, const int s){
|
|
|
return write(1, b, s);
|
|
|
}
|
|
|
|
|
|
-int fileDsRecv(fileDs d, char *b, const int s){
|
|
|
- return read(d->f, b, s);
|
|
|
-}
|
|
|
-int sockDsRecv(sockDs d, char *b, const int s){
|
|
|
- return read(d->s, b, s);
|
|
|
+int recvDs(ds d, char *b, const int s){
|
|
|
+ return read(d->fd, b, s);
|
|
|
}
|
|
|
int tlsDsRecv(tlsDs d, char *b, const int s){
|
|
|
return SSL_read(d->s, b, s);
|
|
@@ -198,36 +195,27 @@ int stdDsRecv(char *b, const int s){
|
|
|
}
|
|
|
|
|
|
|
|
|
-void closeFileDs(fileDs d){
|
|
|
- close(d->f);
|
|
|
- free(d);
|
|
|
-}
|
|
|
-void closeSockDs(sockDs d){
|
|
|
- close(d->s);
|
|
|
+int prepareToClose(ds d){
|
|
|
+ int fd = d->fd;
|
|
|
free(d);
|
|
|
+ return fd;
|
|
|
}
|
|
|
|
|
|
-void closeTlsDs(tlsDs d){
|
|
|
+ds closeTlsDs(tlsDs d){
|
|
|
+ ds original = d->original;
|
|
|
SSL_shutdown(d->s);
|
|
|
SSL_shutdown(d->s);
|
|
|
SSL_free(d->s);
|
|
|
- switch(d->tp){
|
|
|
- case file:
|
|
|
- closeFileDs(d->original);
|
|
|
- break;
|
|
|
- case sock:
|
|
|
- closeSockDs(d->original);
|
|
|
- break;
|
|
|
- }
|
|
|
free(d);
|
|
|
+ return original;
|
|
|
}
|
|
|
|
|
|
void closeHandler(nethandler h){
|
|
|
- close(h->s);
|
|
|
+ close(h->fd);
|
|
|
free(h);
|
|
|
}
|
|
|
|
|
|
-tlsDs startSockTls(sockDs d, const char *cert, const char *key){
|
|
|
+tlsDs startSockTls(ds d, const char *cert, const char *key){
|
|
|
loadOpenSSL();
|
|
|
SSL_CTX * ctx = NULL;
|
|
|
if(d->server)
|
|
@@ -239,26 +227,28 @@ tlsDs startSockTls(sockDs d, const char *cert, const char *key){
|
|
|
SSL_CTX_set_options(ctx, SSL_OP_SINGLE_DH_USE);
|
|
|
if(cert)
|
|
|
if(SSL_CTX_use_certificate_chain_file(ctx, cert) != 1){
|
|
|
- closeSockDs(d);
|
|
|
+ int f = prepareToClose(d);
|
|
|
+ closeFd(f);
|
|
|
return clear(ctx);
|
|
|
}
|
|
|
if(key)
|
|
|
if(SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM) != 1){
|
|
|
- closeSockDs(d);
|
|
|
+ int f = prepareToClose(d);
|
|
|
+ closeFd(f);
|
|
|
return clear(ctx);
|
|
|
}
|
|
|
tlsDs t = (tlsDs)malloc(sizeof(s_tlsDs));
|
|
|
t->original = d;
|
|
|
if(!(t->s = SSL_new(ctx))){
|
|
|
- closeSockDs(d);
|
|
|
+ int f = prepareToClose(d);
|
|
|
+ closeFd(f);
|
|
|
clear(ctx);
|
|
|
return clear(t);
|
|
|
}
|
|
|
- if(!SSL_set_fd(t->s, d->s)){
|
|
|
+ if(!SSL_set_fd(t->s, d->fd)){
|
|
|
closeTlsDs(t);
|
|
|
return NULL;
|
|
|
}
|
|
|
- printf("Starting handshake\n");
|
|
|
int retry = 1;
|
|
|
int e;
|
|
|
while(retry){
|
|
@@ -273,13 +263,19 @@ tlsDs startSockTls(sockDs d, const char *cert, const char *key){
|
|
|
if((erval == SSL_ERROR_WANT_READ) || (erval == SSL_ERROR_WANT_WRITE)){
|
|
|
|
|
|
}else{
|
|
|
- printf("Error\n");
|
|
|
- ERR_print_errors(t->s->bbio);
|
|
|
+ //ERR_print_errors(t->s->bbio);
|
|
|
closeTlsDs(t);
|
|
|
return NULL;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- printf("Success\n");
|
|
|
return t;
|
|
|
}
|
|
|
+
|
|
|
+int getFd(ds d){
|
|
|
+ return d->fd;
|
|
|
+}
|
|
|
+
|
|
|
+void closeFd(int fd){
|
|
|
+ close(fd);
|
|
|
+}
|