1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 || (int64_t)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;
}
|