summaryrefslogtreecommitdiff
path: root/socket_init.h
blob: ceddb9c3f32fe45be074598a682a03af37d760a5 (about) (plain)
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 || (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;
}