summaryrefslogtreecommitdiff
path: root/socket_init.h
diff options
context:
space:
mode:
Diffstat (limited to 'socket_init.h')
-rw-r--r--socket_init.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/socket_init.h b/socket_init.h
new file mode 100644
index 0000000..ceddb9c
--- /dev/null
+++ b/socket_init.h
@@ -0,0 +1,32 @@
+#define SOCKET_INIT_SUCCESS 0
+#define SOCKET_INIT_FAILED -1
+
+int init_socket( server_socket_t *sckdata, server_config_t *scfg ){
+ if ( (uint16_t)atoi(scfg->bind_port->valuestring) == 0 )
+ return SOCKET_INIT_FAILED;
+ if ( scfg->bind_address == NULL || (long long int)strlen(scfg->bind_address->valuestring) <= 0 || strcmp((const char*)scfg->bind_address->valuestring, "") == 0 )
+ return SOCKET_INIT_FAILED;
+ sckdata->socket_fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
+ if ( sckdata->socket_fd == -1 )
+ return SOCKET_INIT_FAILED;
+ sckdata->sck_in.sin_family = AF_INET;
+ sckdata->sck_in.sin_port = (in_port_t)htons( (uint16_t)atoi(scfg->bind_port->valuestring) );
+ sckdata->sck_in.sin_addr.s_addr = (uint32_t)inet_addr( (const char*)scfg->bind_address->valuestring );
+ int reuseaddr_val = 1;
+ int reuseport_val = 1;
+ if ( setsockopt(sckdata->socket_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_val, (socklen_t)sizeof(reuseaddr_val)) == -1 )
+ return SOCKET_INIT_FAILED;
+ if ( setsockopt(sckdata->socket_fd, SOL_SOCKET, SO_REUSEPORT, &reuseport_val, (socklen_t)sizeof(reuseport_val)) == -1 )
+ return SOCKET_INIT_FAILED;
+ if ( bind(sckdata->socket_fd, (struct sockaddr*)&sckdata->sck_in, (socklen_t)sizeof(sckdata->sck_in)) == -1 )
+ return SOCKET_INIT_FAILED;
+ sckdata->tls_context = SSL_CTX_new( TLS_server_method() );
+ if ( sckdata->tls_context == NULL )
+ return SOCKET_INIT_FAILED;
+ if ( SSL_CTX_use_certificate_file(sckdata->tls_context, (const char*)scfg->cert_file->valuestring, SSL_FILETYPE_PEM) != 1 )
+ return SOCKET_INIT_FAILED;
+ if ( SSL_CTX_use_PrivateKey_file(sckdata->tls_context, (const char*)scfg->cert_key_file->valuestring, SSL_FILETYPE_PEM) != 1 )
+ return SOCKET_INIT_FAILED;
+ SSL_CTX_set_verify( sckdata->tls_context, SSL_VERIFY_NONE, NULL );
+ return SOCKET_INIT_SUCCESS;
+}