diff options
Diffstat (limited to 'socket_init.h')
-rw-r--r-- | socket_init.h | 32 |
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; +} |